2013-05-13 22 views
6

Próbuję połączyć się z bazą danych w Javie, używając jdbcTemplate i otrzymuję błąd poniżej. Mam Googled przez długi czas i wszystkie rozwiązania, które znalazłem, nie rozwiązały mojego problemu. Wypróbowałem kilka różnych baz danych (zarówno SQLServer, jak i MySQL) i żaden z nich nie działał.ResourcePool nie może uzyskać zasobów z podstawowej fabryki lub źródła

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/promotion-handler-admin] threw exception [Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!] with root cause 
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622) 
    ... 

To jest mój plik właściwości:

app.driverClassName=net.sourceforge.jtds.jdbc.Driver 
app.url=jdbc:sqlserver://myUrl:port;databaseName=my_database 
app.username=myUsername 
app.password=myPassword 

webapp/WEB-INF/ApplicationContext-database.xml: Klasa

<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close"> 
    <beans:property name="driverClass" value="${app.driverClassName}" /> 
    <beans:property name="jdbcUrl" 
     value="${app.url}" /> 
    <beans:property name="user" value="${app.username}" /> 
    <beans:property name="password" value="${app.password}" /> 
    <beans:property name="acquireIncrement" value="5" /> 
    <beans:property name="idleConnectionTestPeriod" value="600" /> 
    <beans:property name="maxPoolSize" value="10" /> 
    <beans:property name="maxStatements" value="5" /> 
    <beans:property name="minPoolSize" value="3" /> 
    <beans:property name="preferredTestQuery" value="select 1 from DUAL" /> 
</beans:bean> 

<!-- TRANSACTION_MANAGERS --> 
<!-- See http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html --> 

<!-- Default --> 
<beans:bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <beans:property name="dataSource" ref="dataSource" /> 
</beans:bean> 

DAO:

@Repository 
public class CampaignDAO { 
    private JdbcTemplate jdbcTemplate; 

    @Resource(name = "dataSource") 
    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 

public List<Campaign> getCampaignList() { 
    Long start = System.currentTimeMillis(); 

    List<Campaign> queryList; 

    try { 
     queryList = jdbcTemplate.query("SELECT * FROM campaign", new RowMapper<Campaign>() { 
      public Campaign mapRow(ResultSet rs, int line) throws SQLException { 
       Campaign campaign = new Campaign(); 
       campaign.setId(rs.getLong("id")); 
       campaign.setExtraInfo(rs.getString("extra_info")); 
       campaign.setBeginTime(rs.getDate("begin_time")); 
       campaign.setEndTime(rs.getDate("end_time")); 

       return campaign; 

      } 
     }); 
    } finally { 
     ... 
    } 
    return queryList; 
} 

Odpowiedz

5

Dla każdy, kto znajdzie to pytanie w fut ure. To, co robiłem źle, to to, że używałem sterownika jtds i zapomniałem dodać go w adresie URL. Więc złożyć moje właściwości co powinienem zrobić to:

app.url=jdbc:jtds:sqlserver://myUrl:port;databaseName=my_database 
0

mam ten problem na C3P0 0.9.5-PRE6 z mchange-commons-java 0.2.6.3. Po przejściu na wersję c3p0 0.9.5-pre5 i mchange-commons-java 0.2.6.2 problem znika.

4

Dla każdego, kto znajdzie to pytanie w przyszłości.

Może to być spowodowane brakującym sterownikiem bazy danych.

W moim przypadku użyłem zestawu maven-shade-plugin z zestawem opcji minimizeJar. To - oczywiście - odrzuciło sterownik jtds, ponieważ nie jest nigdzie bezpośrednio odnoszone.

ta może być ustalona w następujący sposób:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.6</version> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     <configuration> 
      <minimizeJar>true</minimizeJar> 
      <filters> 
      <filter> 
       <!-- Make sure jtds is included. --> 
       <artifact>net.sourceforge.jtds:jtds</artifact> 
       <includes> 
        <include>**</include> 
       </includes> 
      </filter> 
      <filter> 
       <artifact>*:*</artifact> 
       <excludes> 
       <exclude>META-INF/*.SF</exclude> 
       <exclude>META-INF/*.DSA</exclude> 
       <exclude>META-INF/*.RSA</exclude> 
       <exclude>META-INF/*.sf</exclude> 
       <exclude>META-INF/*.dsa</exclude> 
       <exclude>META-INF/*.rsa</exclude> 
       </excludes> 
      </filter> 
      </filters> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
+1

W naszym przypadku to było również brakującego sterownika: musiał dodać do Maven pom: \t \t \t \t \t mysql \t \t \t mysql-connector-java \t \t \t 5.1.35 \t \t Erikson

1

mogą być wyświetlane także ten komunikat, jeśli, tak jak ja, uruchomić aplikację za pomocą wtyczki Maven dla Tomcat:

mvn clean install tomcat7:run 

i ty mieć element provided zakres w zależności Maven:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.36</version> 
    <scope>provided</scope> 
</dependency> 

provided zakres uniemożliwi dołączenie łącznika do archiwum war, a wtyczka Tomcat nie znajdzie żadnego łącznika do ustanowienia połączenia z bazą danych.

Po prostu usunięcie zakresu provided z zależności rozwiązuje problem.