我有一個每天運行一次(大約1或2小時)的TimerTask。在每次運行時,它都會創建數百個線程爲MySQL數據庫中的每個表執行一些計算工作。我使用c3p0作爲數據庫源連接池(每個線程在計算之前獲得連接並在計算後關閉連接)。我設置了連接池的配置如下,c3p0如何關閉所有數據庫連接並在需要時重新打開它們?
cpDs = new ComboPooledDataSource();
cpDs.setMinPoolSize(10);
cpDs.setMaxPoolSize(20);
cpDs.setMaxStatementsPerConnection(10);
在測試過程中,我發現所有的數據庫連接,在第二天的運行丟失了,和大量的「通信鏈路故障,由於底層異常」在日誌中均表現文件。所以我添加了以下配置以便在使用它之前測試連接。
// 7 hours, less than MYSQL default value - 8 hours
cpDs.setMaxIdleTime(25200);
cpDs.setTestConnectionOnCheckout(true);
cpDs.setPreferredTestQuery("select 1");
,但我注意到,總有10個連接留睡眠/空閒狀態(通過SQL「SHOW PROCESSLIST;」)時一個TimerTask沒有運行,我經常看到著名的「視死鎖!!!」警告(該bug在c3p0項目http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690中仍處於打開狀態)。
那麼有沒有辦法在所有的計算工作完成時關閉所有連接,並在第二天重新執行任務時重新構建連接?謝謝。
問候, 喬伊
謝謝羅布,你的建議非常有幫助!我試過了,所有連接都在maxIdleTime過去後關閉。很好! – 2012-01-08 06:44:05