web-dev-qa-db-ja.com

ResourcePoolは、プライマリファクトリまたはソースからリソースを取得できませんでした

私はjdbcTemplateを使用してJavaでデータベースに接続しようとしていますが、以下のエラーが発生します。私は長い間Googleを利用してきましたが、見つかったすべての解決策で問題が解決しませんでした。私はいくつかの異なるDB(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

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

将来この質問を見つけた人のために。私が間違っていたのは、jtdsドライバーを使用していて、それをURLに追加するのを忘れていたことです。だから私のプロパティファイルで私がやるべきだったのは:

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

将来この質問を見つけた人のために。

これは、データベースドライバーの欠落が原因である場合もあります。

私の場合、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>
6
OldCurmudgeon

このメッセージは、私と同じように、TomcatのMavenプラグインを使用してアプリケーションを実行した場合にも表示されます。

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プラグインはデータベース接続を確立するためのコネクタを見つけられません。

依存関係からprovidedスコープを削除するだけで問題が解決します。

2
Stephane

私の場合、問題はMySQLとmysql-connector-Java間のバージョンの不一致に関連していました。数日頭痛がした後、別のクリーンプロジェクトでComboPooledDataSourceモジュールを取り出し、それをMySQLに接続しようとしました。しかし、私はスタックトレースを取得しました(残念ながら、正確に何があったのか忘れてしまいました)。これにより、問題がバージョンに関連していることがわかりました。

0
dimson

Mchange-commons-Java 0.2.6.3を使用するc3p0 0.9.5-pre6でこの問題が発生しました。 c3p0 0.9.5-pre5およびmchange-commons-Java 0.2.6.2にダウングレードすると、問題は解消します。

0
Conan