ResourcePool无法从其主要工厂或来源获取资源 [英] A ResourcePool could not acquire a resource from its primary factory or source

查看:150
本文介绍了ResourcePool无法从其主要工厂或来源获取资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用jdbcTemplate连接到Java中的数据库,并且出现以下错误.我已经使用Google搜索了很长时间,发现的所有解决方案都无法解决我的问题.我尝试了几种不同的数据库(SQLServer和MySQL),但没有一个起作用.

I'm trying to connect to a database in Java, using jdbcTemplate and I'm gettin the error below. I have Googled for a long time and all solutions I found didn't solve my problem. I tried several different DBs (both SQLServer and MySQL) and none worked.

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

webapp/WEB-INF/applicationContext-database.xml:

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>

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

推荐答案

适用于以后发现此问题的任何人.我做错的是我正在使用jtds驱动程序,但忘记在URL中添加它.所以在我的属性文件中,我应该做的是:

For anyone that finds this question in the future. What I was doing wrong was that I was using the jtds driver and I forgot to add that in the url. So in my properties file what I should have done was:

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

这篇关于ResourcePool无法从其主要工厂或来源获取资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆