2013-05-13 45 views
6

Tôi đang cố gắng kết nối với cơ sở dữ liệu trong Java, bằng cách sử dụng jdbcTemplate và tôi gettin lỗi bên dưới. Tôi đã google trong một thời gian dài và tất cả các giải pháp tôi tìm thấy đã không giải quyết được vấn đề của tôi. Tôi đã thử một số DB khác nhau (cả SQLServer và MySQL) và không có ai làm việc.Một ResourcePool không thể có được một tài nguyên từ nhà máy chính của nó hoặc nguồn

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

Đây là tập tin thuộc tính của tôi:

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 lớp:

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

Trả lời

5

Đối bất cứ ai tìm thấy câu hỏi này trong tương lai ure. Những gì tôi đã làm sai là tôi đã sử dụng trình điều khiển jtds và tôi quên để thêm rằng trong url. Vì vậy, trong tập tin tài sản của tôi những gì tôi nên làm là:

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

Tôi có vấn đề này trên C3P0 0.9.5-pre6 với mchange-commons-java 0.2.6.3. Sau khi hạ cấp xuống c3p0 0.9.5-pre5 và mchange-commons-java 0.2.6.2, sự cố sẽ biến mất.

4

Đối với bất kỳ ai tìm thấy câu hỏi này trong tương lai.

Điều này cũng có thể do trình điều khiển cơ sở dữ liệu bị thiếu.

Trong trường hợp của tôi, tôi đã sử dụng maven-shade-plugin với tùy chọn minimizeJar. Điều này - tất nhiên - đã ném đi trình điều khiển jtds vì nó không được tham chiếu trực tiếp ở bất cứ đâu.

này có thể được cố định như sau:

<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

Trong trường hợp của chúng tôi nó cũng đã mất tích lái xe: có để thêm video này Maven pom: \t \t \t \t \t mysql \t \t \t mysql-connector-java \t \t \t 5.1.35 \t \t Erikson

1

Thông báo này cũng có thể được hiển thị, nếu, như tôi, bạn chạy ứng dụng của bạn với các plugin Maven cho Tomcat:

mvn clean install tomcat7:run 

và bạn có phần tử phạm vi provided trong phụ thuộc Maven của bạn:

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

Phạm vi 210 sẽ ngăn không cho trình kết nối là một phần của lưu trữ war và plugin Tomcat sẽ không tìm thấy trình kết nối nào để thiết lập kết nối cơ sở dữ liệu.

Chỉ cần xóa phạm vi provided khỏi phụ thuộc giải quyết được vấn đề.