ResourcePool无法从其主工厂或源获取资源

我正在尝试使用jdbcTemplate连接到Java中的数据库,我得到以下错误。 我用谷歌搜索了很长时间,我找到的所有解决方案都没有解决我的问题。 我尝试了几个不同的数据库(SQLServer和MySQL),但没有一个工作。

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

这是我的属性文件:

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

web应用/ WEB-INF /的applicationContext-database.xml:

                   

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

对于将来发现此问题的任何人。 我做错了是因为我使用的是jtds驱动程序,我忘了在url中添加它。 所以在我的属性文件中我应该做的是:

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

对于将来发现此问题的任何人。

这也可能是由于缺少数据库驱动程序引起的。

在我的情况下,我使用maven-shade-pluginminimizeJar选项集。 这当然是扔掉了jtds驱动程序,因为它没有直接引用任何地方。

这可以修复如下:

   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        

如果像我一样使用Tomcat的Maven插件运行应用程序,也可以显示此消息:

 mvn clean install tomcat7:run 

并且您在Maven依赖项中有一个provided范围元素:

  mysql mysql-connector-java 5.1.36 provided  

provided作用域将阻止连接器成为war存档的一部分,并且Tomcat插件将找不到用于建立数据库连接的连接器。

简单地从依赖项中删除provided范围可以解决问题。

我在mchange-commons-java 0.2.6.3的c3p0 0.9.5-pre6上遇到了这个问题。 降级到c3p0 0.9.5-pre5和mchange-commons-java 0.2.6.2之后,问题就消失了。

在我的情况下,问题与MySQL和mysql-connector-java之间的版本错误相关。 经过几天的头痛,我在一个单独的干净项目中取出了我的ComboPooledDataSource模块,并尝试将其连接到MySQL。 但是,我得到了堆栈跟踪(不幸的是我忘记了究竟是什么),我明白这个问题与版本有关。