Un ResourcePool no pudo adquirir un recurso de su fábrica o fuente primaria

Estoy tratando de conectarme a una base de datos en Java, usando jdbcTemplate y obtengo el siguiente error. He buscado en Google durante mucho tiempo y todas las soluciones que encontré no resolvieron mi problema. Probé varios DBs diferentes (tanto SQLServer como MySQL) y ninguno funcionó.

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

Este es mi archivo de propiedades:

 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:

                   

Clase DAO:

 @Repository public class CampaignDAO { private JdbcTemplate jdbcTemplate; @Resource(name = "dataSource") public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public List getCampaignList() { Long start = System.currentTimeMillis(); List queryList; try { queryList = jdbcTemplate.query("SELECT * FROM campaign", new RowMapper() { 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; } 

Para cualquiera que encuentre esta pregunta en el futuro. Lo que estaba haciendo mal fue que estaba usando el controlador jtds y olvidé agregarlo en la url. Así que en mi archivo de propiedades lo que debería haber hecho fue:

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

Para cualquiera que encuentre esta pregunta en el futuro.

Esto también puede ser causado por un controlador de base de datos faltante.

En mi caso, estaba usando el maven-shade-plugin in de maven-shade-plugin con el conjunto de opciones minimizeJar . Esto, por supuesto, estaba jtds controlador jtds porque no está directamente referenciado en ninguna parte.

Esto se puede arreglar de la siguiente manera:

   org.apache.maven.plugins maven-shade-plugin 1.6   package  shade   true    net.sourceforge.jtds:jtds  **    *:*  META-INF/*.SF META-INF/*.DSA META-INF/*.RSA META-INF/*.sf META-INF/*.dsa META-INF/*.rsa        

Este mensaje también se puede mostrar si, como yo, ejecuta su aplicación con el complemento Maven para Tomcat:

 mvn clean install tomcat7:run 

y tiene un elemento de scope provided en su dependencia de Maven:

  mysql mysql-connector-java 5.1.36 provided  

El scope provided evitará que el conector sea parte del archivo war y el complemento Tomcat no encontrará ningún conector para establecer la conexión de la base de datos.

Simplemente eliminando el scope provided de la dependencia se resuelve el problema.

Tengo este problema en c3p0 0.9.5-pre6 con mchange-commons-java 0.2.6.3. Después de bajar a c3p0 0.9.5-pre5 y mchange-commons-java 0.2.6.2, el problema desaparece.

En mi caso, el problema estaba relacionado con el desajuste de versión entre MySQL y mysql-connector-java. Después de unos días de dolor de cabeza, saqué mi módulo ComboPooledDataSource en un proyecto limpio independiente y traté de conectarme con MySQL. Sin embargo, obtuve stacktrace (desafortunadamente olvidé qué era exactamente allí), con lo que entendí que el problema está relacionado con las versiones.