2017-10-30 4 views
0

私は次のエラーに直面しています。この問題が発生している場所でデバッグするのは非常に困難です。Java SpringでC3P0デッドロック

<bean id="sessionFactory1" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.connection.driver_class">${db.driver}</prop> 
      <prop key="hibernate.connection.url">${db.jdbcurl2}</prop> 
      <prop key="hibernate.connection.username">${db.username2}</prop> 
      <prop key="hibernate.connection.password">${db.password2}</prop> 
      <prop key="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider 
      </prop> 
      <prop key="hibernate.c3p0.min_size">1</prop> 
      <prop key="hibernate.c3p0.max_size">6</prop> 
      <prop key="hibernate.c3p0.maxIdleTime">3000</prop> 
      <prop key="hibernate.c3p0.timeout">5000</prop> 
      <prop key="hibernate.c3p0.max_statements">50</prop> 
      <prop key="hibernate.c3p0.idle_test_period">3000</prop> 
      <prop key="hibernate.c3p0.preferredTestQuery">SELECT 1</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql" >false</prop> 
      <prop key="hibernate.format_sql" >false</prop> 
      <prop key="hibernate.hbm2ddl.auto" >update</prop> 
     </props> 
    </property> 
</bean> 

<bean id="sessionFactory2" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" primary="true"> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.connection.driver_class">${db.driver}</prop> 
       <prop key="hibernate.connection.url">${db.jdbcurl}</prop> 
       <prop key="hibernate.connection.username">${db.username}</prop> 
       <prop key="hibernate.connection.password">${db.password}</prop> 
       <prop key="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider 
       </prop> 
       <prop key="hibernate.c3p0.min_size">1</prop> 
       <prop key="hibernate.c3p0.max_size">6</prop> 
       <prop key="hibernate.c3p0.maxIdleTime">3000</prop> 
       <prop key="hibernate.c3p0.timeout">5000</prop> 
       <prop key="hibernate.c3p0.max_statements">50</prop> 
       <prop key="hibernate.c3p0.idle_test_period">3000</prop> 
       <prop key="hibernate.c3p0.preferredTestQuery">SELECT 1</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
       <prop key="hibernate.show_sql" >false</prop> 
       <prop key="hibernate.format_sql" >false</prop> 
       <prop key="hibernate.hbm2ddl.auto" >update</prop> 
      </props> 
     </property> 
    </bean> 

そして、次の接続データ:

db.driver =はcom.mysql.jdbc.Driver

hibernate.dialect = org.hibernate私は、次の2セッションの工場があります。 dialect.MySQLDialect

db.jdbcurl = JDBCます。mysql:// localhostを:3306/XXXXautoReconnect =真& allowMultiQueries =真 db.username = XXXX

db.password = YYYY

db.jdbcurl2 = JDBCます。mysql://XXXXX-cluster.XXXXXXXX.eu-west-2.rds.amazonaws.com:?3306/XXXX自動再=真& allowMultiQueries =真

db.username2 = XXXX

db.password2 = YYYY

これは私がログから取得するエラーメッセージです:

2017-10-30 12:16:25 WARN ThreadPoolAsynchronousRunner:743 - com[email protected]6cf38f72 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
2017-10-30 12:16:25 WARN ThreadPoolAsynchronousRunner:759 - com[email protected]6cf38f72 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     com[email protected]5371f5ab 
      on thread: C3P0PooledConnectionPoolManager[identityToken->1bqsmig9ruavayon79lc0|319cb4da]-HelperThread-#0 
     com[email protected]12e0b3c5 
      on thread: C3P0PooledConnectionPoolManager[identityToken->1bqsmig9ruavayon79lc0|319cb4da]-HelperThread-#2 
     com[email protected]2b726e6f 
      on thread: C3P0PooledConnectionPoolManager[identityToken->1bqsmig9ruavayon79lc0|319cb4da]-HelperThread-#1 
    Pending Tasks: 
     com[email protected]432689e8 
Pool thread stack traces: 
    Thread[C3P0PooledConnectionPoolManager[identityToken->1bqsmig9ruavayon79lc0|319cb4da]-HelperThread-#0,5,RMI Runtime] 
     java.net.PlainSocketImpl.socketConnect(Native Method) 
     java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
     java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 

私はc3p0.max_statementsを0に設定しようとしましたが、他の多くのものはうまくいきませんでした。この問題を解決する方法を知っていれば、私はあなたの助けを求めています。

私は、2つのデータソースをローカルで使用していたときにうまく動作するために使用されていたことを言及する価値があると思います。私が新しいRDSインスタンスを作成し、jdbcurl URLをrdsに変更した分、上記のエラーメッセージが出ました。

ありがとうございます!

答えて

0

問題は、RDSデータベースへのアクセスがハングアップしていることです。つまり、Exceptionで失敗しても、成功していなくても、Exception、Hangだけでも問題はありません。クライアントからの接続を受け入れるようにインスタンスを正しく構成していないと、AWSでConnectionがハングすることがありました。それはおそらくあなたの問題です。これをテストし、デバッグする

片道の方法は、簡単なテストプログラムである、

import java.sql.*; 

public static void main(String[] argv) { 
    try { 
    DriverManager.getConnection("dbc:mysql://XXXXX-cluster.XXXXXXXX.eu-west-2.rds.amazonaws.com:3306/XXXX?autoReconnect=true&allowMultiQueries=true","XXXX","YYYY").close(); 
    System.out.println("Successfully acquired and closed a Connection."); 
    } 
    catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

のようなもの、あなたはいくつかの並べ替えのREPLへのアクセス権を持っている場合は、単に

DriverManager.getConnection("dbc:mysql://XXXXX-cluster.XXXXXXXX.eu-west-2.rds.amazonaws.com:3306/XXXX?autoReconnect=true&allowMultiQueries=true","XXXX","YYYY").close(); 

してみてくださいこれはアプリケーションを実行しようとしているマシンから成功します。おそらくアプリケーションもそうです。

+0

これは実際に問題が発生している場所で、今は1日間デバッグしていますが、なぜこれが起きているのかまだ分かりません。私はSequel ProとMySQLWorkbenchを通してRDSインスタンスに接続できましたが、私のJavaプログラムからではありません...私の接続URLはあなたと同じフォーマットですが、何らかの理由でタイムアウトしています。 – user3153278

+0

編集:私逆方向トンネルを作成し、URL文字列を127.0.0.1に変更し、ポートを逆方向トンネルの1つに変更してローカルで動作させる必要がありました。 – user3153278

関連する問題