6

tomcatまたはresinでプロジェクトを起動すると、プロジェクトで次のエラーがスローされます:APPARENT DEADLOCK

c3p0が原因のエラーでデータベースに接続できないと思います。xmlを変更し、ドメイン名をデータベースのIPに置き換えてから、プロジェクトを起動します。

c3p0が機能する前にリスナーを使用していますが、正しいドメイン名とIPを取得できますが、APPARENTDEADLOCKの理由が見つかりません。

012-10-22 16:53:04 24344    WARN  [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e79aa -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@723a14 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@14313ff (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@d5f50d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@cb560b
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@17e107c
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        java.net.PlainSocketImpl.socketConnect(Native Method)
        java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
4

2 に答える 2

4

原因を見つけたようです。DNSに問題があるため、IPでデータベースに接続しているときに、名前でデータベースを検索しようとするとハングします。表示されているc3p0メッセージは、データベースから接続を取得しようとする試みがハングしていることを示しています(つまり、例外で成功も失敗もしていません)。最終的に、それらのハングしたtasakはc3p0のスレッドプールを使い果たし、APPARENTDEADLOCK警告が表示されます。

user1516873によって提案された設定statementCacheNumDeferredCloseThreadsは、ステートメント関連のタスクがデッドロックを引き起こしているのを確認した場合に役立ちますが、この場合は役に立たない可能性があります。あなたは、データベースから接続を取得するためのプールによる試みにぶら下がっています。

あなたがしなければならない主なことはあなたのウェブアプリサーバー上のDNS問題をデバッグすることです。nslookupやdigなどのツールを試して、データベースサーバーを名前でルックアップできるかどうか、結果がすぐに表示されるかどうか、またはルックアップでハングアップするかどうかを確認してください。あなたが説明することから、あなたはそこに問題を見つける可能性が非常に高いでしょう。

于 2012-10-22T12:05:00.653 に答える
1

ドキュメントで説明されているように:http ://www.mchange.com/projects/c3p0/ 、セクションステートメントプーリングの構成

statementCacheNumDeferredCloseThreadsがゼロより大きい場合、ステートメントプールは、親接続がクライアントによって使用されなくなるまで、またはプール自体によって内部的に(たとえば、テストで)使用されなくなるまで、キャッシュされたステートメントを物理的にclose()延期します。一部のJDBCドライバー(特にOracle)では、親接続が使用されている場合、ステートメントのフリーズを閉じようとします。このパラメーターのデフォルトは0です。接続クローズタスクに適用される「APPARENTDEADLOCKS を確認する場合は、このパラメーターを正の値に設定してください。ほとんどの場合、その値は1である必要があります。ステートメントの破棄専用のスレッドが複数必要な場合は、キャッシュされたステートメントをすぐに変更しないように、maxStatementsやmaxStatementsPerConnectionをより高い値に設定する必要があります。

于 2012-10-22T09:23:41.873 に答える