2013-05-13 57 views
6

我试图使用jdbcTemplate连接到Java数据库,并且我正在获取下面的错误。我搜索了很长时间,我发现的所有解决方案都无法解决我的问题。我尝试了几个不同的数据库(SQLServer和MySQL),都没有工作。ResourcePool无法从其主要工厂或源获取资源

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:

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

回答

5

对于任何人都会在最后发现这个问题URE。我做错了什么是我使用jtds驱动程序,我忘了在url中添加它。所以在我的属性文件,是我应该做的是:

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

我上C3P0 0.9.5-PRE6与mchange公地的Java 0.2.6.3这个问题。降级到c3p0 0.9.5-pre5和mchange-commons-java 0.2.6.2后,问题消失。

4

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

这也可能是由缺少数据库驱动程序造成的。

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

这可以被确定如下:

<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

在我们的情况下,它也缺少驱动程序:必须把它添加到Maven的POM:\t \t \t \t \t MySQL的 \t \t \t 使用mysql-connector-java的 \t \t \t 5.1.35 \t \t Erikson 2015-06-16 14:21:43

1

还可以显示该消息,如果像我一样,你运行与Maven插件应用程序为Tomcat:

mvn clean install tomcat7:run 

和你在您的Maven依赖项中有一个provided范围元素:

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

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

只需从dependency中删除provided范围即可解决问题。