12

プロジェクトの [Hibernate + c3p0 + MySQL] 構成があります。次の例外が発生しています。

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) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ~[c3p0-0.9.1.2.jar:0.9.1.2]
Wrapped by: java.sql.SQLException: Connections could not be acquired from the underlying database!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:276) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
Wrapped by: org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:52) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1263) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:399) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE]
Wrapped by: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:440) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:336) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at $Proxy28.messageExists(Unknown Source) ~[na:na]

私たちの c3p0 設定:

<bean id="provDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
…
        <property name="acquireIncrement" value="1" />
        <property name="idleConnectionTestPeriod" value="100"/>
        <property name="minPoolSize" value="5" />
        <property name="maxPoolSize" value="50" />
        <property name="maxIdleTime" value="1800" />
</bean>

この MySQL インスタンスの上に別の同様の c3p0 データソースが構成されていることに注意してください。

これをデバッグする方法について誰か提案してもらえますか?

4

2 に答える 2

0

あなたの質問に厳密には答えていませんが、コメント内のコードは判読できないため、コメントにコードを追加したくありませんでした。

これは、私のプロジェクトの C3P0 を使用した MySQL の構成例です。接続が切断されないように、すべての追加パラメータに注意してください。(最終的には Postgres を使用しました。これは、接続を切断せず、一般的により安定しており、select 1 で接続を再テストする必要があるためです。あまり効率的ではありません)

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
     destroy-method="close">
  <property name="driverClass" value="${jdbc.driverClassName}"/>
  <property name="jdbcUrl" value="${jdbc.url}"/>
  <property name="properties">
    <props>
        <prop key="c3p0.minPoolSize">0</prop>
        <prop key="hc3p0.maxPoolSize">1000</prop>
        <prop key="hc3p0.timeout">3000</prop>
        <prop key="c3p0.acquire_increment">10</prop>
        <prop key="c3p0.max_statement">50</prop>

        <prop key="hibernate.c3p0.idle_test_period">60</prop>
        <prop key="c3p0.preferredTestQuery">SELECT 1;</prop>
        <prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
        <prop key="user">${jdbc.username}</prop>
        <prop key="password">${jdbc.password}</prop>
    </props>
  </property>
</bean>
于 2012-11-20T22:29:30.107 に答える
0

問題の解決に役立つ次の原因と解決策のリストを見つけました。他の人にも役立つかもしれません:

  1. 入力したデータベース構成の詳細が間違っているか、変更されています。たとえば、Confluence データベースのデータベース名またはデータベースのユーザー名/パスワードです。/confluence.cfg.xml のデータベース ユーザー名、パスワード、および接続 URL が正しくないことを確認し、正しくない場合は適宜更新します。
  2. データベースの URL が正しくありません。たとえば、データベース接続が jdbc:mysql://yma/confluence?autoReconnect=true の場合、ホスト 'yma' は存在し、データベース サーバーは 'yma' にインストールされていますか? /confluence.cfg.xml をチェックして、このエントリを見つけます。
  3. データベース サーバーが実行されていません。データベース サーバーがダウンしている場合は、再起動し、ログをチェックして、失敗または停止した理由を確認します。
  4. ネットワークがダウンしている(または Confluence とそのデータベースの間にファイアウォールがある) ため、データベースへの接続を確立できません。ネットワークがダウンしている場合、または新しいファイアウォールがインストールされている場合は、システム管理者に相談してトラブルシューティングを進めてください。
  5. データベースのパスワードの有効期限が切れています。パスワードの有効期限が切れている場合 (これは、データベース クライアントまたは DbVisualizer などの外部データベース ツールを介してデータベースに接続しようとした場合にのみ発生します)、パスワードを更新してください。問題の再発を防ぐために、Confluence データベース ユーザーの有効期限が近づいているパスワードを無効にすることをお勧めします。これについては、必ず DBA に相談してください。
  6. Postgres 固有の問題: Confluence、環境などを移行またはアップグレードするときに、Postgres 暗号化方式が変更または変更されました。pg_hba.conf ファイルを確認してください。メソッドが ident に設定されている場合は、md5 に変更します。
  7. MySQL 固有の問題: 接続リクエストが多すぎるため、MySQL サーバーが Confluence によるリクエストの作成をブロックするようになりました。解決策については、この MySQL の記事を参照してください。

ソース: https://confluence.atlassian.com/confkb/connections-could-not-be-acquired-from-the-underlying-database-104825087.html

于 2021-03-23T15:29:49.553 に答える