Java hibernate/c3p0重新连接上的进度条

Java hibernate/c3p0重新连接上的进度条,java,swing,hibernate,c3p0,Java,Swing,Hibernate,C3p0,我在swing应用程序中使用带有c3p0的hibernate来访问数据库。c3p0配置为c3p0。testConnectionOnCheckout=true。所以,如果数据库断开连接(例如超时后),c3p0将为我建立一个新连接 它可以正常工作,但如果DB不可访问,c3p0会将GUI冻结一段时间,并在colsole上打印休整消息 26.06.2013 11:42:46,568 WARN [ThreadPoolAsynchronousRunner run] com.mchange.v2.async.

我在swing应用程序中使用带有c3p0的hibernate来访问数据库。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秒钟后,将抛出一个ecxeption
org.hibernate.exception.genericjdbception:cannotopenconnection
。一直以来,GUI都被阻止。我实际上想做的是,显示一些进度条(不确定),其中包含一些合理的消息,如“连接丢失,尝试重新连接”。我怎样才能做到?也许c3p0有一些类似的回调?

我怀疑连接池是否能为GUI提供任何功能。您应该异步执行所有数据库任务。不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
Thread.sleep(n)
为重复任务执行Swing
计时器,或为长时间运行的任务执行
SwingWorker
。有关详细信息,请参阅。@andrewhompson正常情况下,数据库访问并不是一项长时间运行的任务。但若数据库不可访问,而c3p0试图重新连接,那个么它将是一个数据库。我不想每次访问数据库时都显示进度条,除非它花费的时间太长。事实上,我每次都可以启动计时器。但是最简单的方法就是在c3p0中找到一些回调。