データベースにアクセスするために、swing アプリケーションで c3p0 を使用して休止状態を使用しています。c3p0 は で構成されていc3p0.testConnectionOnCheckout=true
ます。したがって、データベースが接続を切断した場合 (たとえばタイムアウト後に)、c3p0 が新しい接続を確立します。
正常に動作しますが、DB にアクセスできない場合、c3p0 は GUI をしばらくフリーズし、colsole に次のメッセージを出力します。
26.06.2013 11:42:46,568 WARN [ThreadPoolAsynchronousRunner run] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@27d8f985 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
26.06.2013 11:42:46,573 WARN [ThreadPoolAsynchronousRunner run] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@27d8f985 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1636d880 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6abfc6e4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@549ad97c (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@23c8749
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@53d5cac4
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,6,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-#1,6,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,6,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)
そして、約 7 秒後に例外org.hibernate.exception.GenericJDBCException: Could not open connection
がスローされます。この間ずっと GUI がブロックされています。私が実際にやりたいことは、「接続が失われました、再接続しようとしています」などの適切なメッセージとともに進行状況バー (不確定) を表示することです。どうすればそれを達成できますか?c3p0 には、このようなものに対するいくつかのコールバックがあるのではないでしょうか?