Tomcatログで次の例外が発生し続けます。
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1201fd18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@408f3be4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7ba516d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@137efe53
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@766b0524
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
Java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
Java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
Java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
MySQLでHibernate3.6.2とC3P00.9.1.2を使用しています。 Googleを数時間検索した後、このAPPARENT DEADLOCK例外は通常、プリペアドステートメントのキャッシュに関連しているようです。これは、hibernate.cfg.xmlのC3P0構成です。
<propertyname="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">60</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.max_statements">0</property>
私はステートメントのキャッシュを一切行っていません。ここで何が悪いのかについてのヒントをいただければ幸いです。
ドッキング解除されているタスクは、接続取得タスクです。つまり、c3p0はデータベースから新しい接続を取得しようとしており、それらの接続取得の試行には長い時間がかかります。
私が最初に行うことは、0.9.2.1にアップグレードすることです。これにより、取得の試行が失敗することがある状況で、接続取得のラウンドを実行する手段が大幅に改善されます。
それでも問題が解決しない場合は、c3p0が接続を取得しようとする試みが長時間ハングしている理由を理解する必要があります。例外で成功も失敗もしません。
私の非常に特殊なケースでは、問題はアプリケーションをデプロイしたサーバーの構成に関係していました。
Oracleドライバが安全な乱数が生成されるのを待っていたためにハングしたのは、アプリケーションのスタックトレースを出力した後でした。
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
Java.io.FileInputStream.readBytes(Native Method)
Java.io.FileInputStream.read(FileInputStream.Java:255)
Sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.Java:539)
Sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.Java:144)
Sun.security.provider.SecureRandom$SeederHolder.(SecureRandom.Java:203)
Sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.Java:221)
Java.security.SecureRandom.nextBytes(SecureRandom.Java:468)
Oracle.security.o5logon.O5Logon.a(Unknown Source)
Oracle.security.o5logon.O5Logon.(Unknown Source)
Oracle.jdbc.driver.T4CTTIoauthenticate.(T4CTTIoauthenticate.Java:582)
Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:401)
Oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.Java:553)
Oracle.jdbc.driver.T4CConnection.(T4CConnection.Java:254)
Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:32)
Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:528)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.Java:134)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:182)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:171)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.Java:137)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.Java:1014)
com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.Java:32)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1810)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
次に、エントロピーノイズについて少し学び、理解する必要がありました。Unixの友人の助けを借りて、サーバーの1つに「ノイズ」を生成するパッケージがインストールされていないことに気付きました。
次の投稿で述べたように、私は次のコマンドを実行しました:cat /proc/sys/kernel/random/entropy_avail 23 cat /proc/sys/kernel/random/poolsize 4096
したがって、安全な乱数を生成するには利用できるエントロピーが少なすぎる場合があります。
パッケージをインストールした後cat /proc/sys/kernel/random/entropy_avail 4096
その後、明らかなデッドロックがなくなり、アプリケーションはDBに接続できるようになりました。
以前にこのような同様のエラーが発生しました。
また、データベースサーバーがIPをブロックしていることが原因である可能性もあります。サーバーのIPがデータベースサーバー/クラウドプロバイダーによってブロックされていないことを確認してください。
私の場合、マルチスレッドを使用してクラウドのデータベースにデータを挿入しようとしていましたが、ローカルでのみ機能し、サーバー(別のネットワーク)では機能しません。