web-dev-qa-db-fra.com

Un ResourcePool n'a pas pu acquérir une ressource de son usine ou source principale

J'essaie de me connecter à une base de données en Java, en utilisant jdbcTemplate et j'obtiens l'erreur ci-dessous. J'ai longtemps cherché sur Google et toutes les solutions que j'ai trouvées n'ont pas résolu mon problème. J'ai essayé plusieurs bases de données différentes (SQLServer et MySQL) et aucune n'a fonctionné.

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)
    ...

Ceci est mon fichier de propriétés:

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:

<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>

Classe 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;
}
9
iomartin

Pour quiconque trouve cette question dans le futur. Ce que je faisais mal, c’était que j’utilisais le pilote jtds et j’avais oublié de l’ajouter à l’URL. Donc, dans mon fichier de propriétés, j'aurais dû faire:

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

Pour quiconque trouve cette question dans le futur. 

Cela peut aussi être causé par un pilote de base de données manquant.

Dans mon cas, j’utilisais le maven-shade-plugin avec le jeu d’options minimizeJar. Ceci, bien sûr, jetait le pilote jtds car il n’était référencé directement nulle part.

Ceci peut être corrigé comme suit:

  <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>
6
OldCurmudgeon

Ce message peut également être affiché si, comme moi, vous exécutez votre application avec le plugin Maven pour Tomcat:

mvn clean install Tomcat7:run

et vous avez un élément provided scope dans votre dépendance Maven:

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

L'étendue provided empêchera le connecteur de faire partie de l'archive war et le plugin Tomcat ne trouvera aucun connecteur pour établir la connexion à la base de données.

Le simple fait de supprimer la portée provided de la dépendance résout le problème.

2
Stephane

Dans mon cas, le problème était lié à une mauvaise version entre MySQL et mysql-connector-Java. Après quelques jours de maux de tête, j'ai sorti mon module ComboPooledDataSource dans un projet propre séparé et j'ai essayé de me connecter à MySQL. Cependant, j'ai eu stacktrace (malheureusement, j'ai oublié ce qu'il y avait exactement), avec lequel j'ai compris que le problème était lié aux versions.

0
dimson

J'ai eu ce problème sur c3p0 0.9.5-pre6 avec mchange-commons-Java 0.2.6.3. Après avoir rétrogradé les versions c3p0 0.9.5-pre5 et mchange-commons-Java 0.2.6.2, le problème disparaît.

0
Conan