配置c3p0設置時遇到問題。該senario是:我有一個Java項目,將於每天凌晨3:00開始,然後連接到數據庫做一些事情。有時候,數據庫可能會在當時關閉,並可能在2或3小時後恢復。
因此,我需要讓程序嘗試在特定的時間間隔內重新連接數據庫,以查看數據庫是否正常,直到它可以成功連接到數據庫。 我試圖配置c3p0無限重新連接數據庫直到成功,但似乎陷入了一些僵局。以下是我的c3p0設置。 我在Spring框架中使用c3p0 v0.9.1和hibernate,數據庫是DB2。當數據庫關閉時,C3p0無法重新連接數據庫
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="acquireRetryAttempts" value="0"/>
<property name="acquireRetryDelay" value="10000"/>
<property name="maxIdleTime"value="60"/>
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="200"/>
<property name="idleConnectionTestPeriod" value="30" />
<property name="preferredTestQuery" value="values(1)" />
</bean>
當我運行程序時,它失敗,錯誤日誌如下所示:
[WARN]: com[email protected]21eb3f -- APPARENT DEADLOCK!!!
Creating emergency threads for unassigned pending tasks!
[WARN]: com[email protected]21eb3f -- APPARENT DEADLOCK!!!
Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
[email protected]d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
[email protected]c (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
[email protected]3 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
[email protected]4
[email protected]0
[email protected]
[email protected]2
[email protected]
[email protected]
[email protected]
Pool thread stack traces:
...
[WARN] [2017-09-04 ThreadPoolAsynchronousRunner.processReplacedThreads() ] Task [email protected]
(in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] [2017-09-04 ThreadPoolAsynchronousRunner.processReplacedThreads() ] Task [email protected]
(in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] [2017-09-04 ThreadPoolAsynchronousRunner.processReplacedThreads() ] Task [email protected]
(in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] [2017-09-04 BasicResourcePool$AcquireTask.run()] [email protected] -- Thread unexpectedly interrupted
while performing an acquisition attempt.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.mchange.v2.resourcepol.BasicResourcePool$AcquireTask.run (BasicResourcePool.java:1805)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
[WARN] [2017-09-04 BasicResourcePool$AcquireTask.run()] [email protected] -- Thread unexpectedly interrupted
while performing an acquisition attempt.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.mchange.v2.resourcepol.BasicResourcePool$AcquireTask.run (BasicResourcePool.java:1805)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
[WARN] [2017-09-04 BasicResourcePool$AcquireTask.run()] [email protected] -- Thread unexpectedly interrupted
while performing an acquisition attempt.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.mchange.v2.resourcepol.BasicResourcePool$AcquireTask.run (BasicResourcePool.java:1805)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
能否請你幫糾正我,如果設置有什麼錯?先謝謝你!
這個'application'是如何啓動的? cron的? –
@Scary是的,是的。 – cmjauto
然後你可以嘗試使用工具,例如數據庫客戶端cli,測試數據庫是否啓動,然後嘗試啓動您的應用程序,並將其放入您的應用程序啓動腳本 –