2013-10-07 161 views
0

我希望C3P0上有一些專家可以幫助我回答以下問題。C3P0連接健康檢查

首先,這是我試圖解決的一般問題。我們有一個應用程序連接到數據庫。當數據庫熄滅時,請求開始處理幾秒鐘,而不是幾毫秒。這是因爲C3P0會嘗試創建與數據庫的新連接。它最終會超時,請求將被拒絕。

我想出了一個解決方案。在從池中獲取連接之前,我將查詢C3P0的API以查看池中是否有任何連接。如果沒有,我們會立即刪除請求。這樣,我們的延遲應該保持在毫秒級,而不是等到超時發生。這個解決方案可以工作,因爲如果C3P0檢測到它們已經壞了,它可以刪除連接。

現在,我設置了一個測試,將「setTestConnectionOnCheckin」和「setTestConnectionOnCheckout」的值設置爲「false」。根據我的理解,這意味着C3P0不會測試連接(或者,假設使用的連接,因爲還有idleConnectionTestPeriod設置)。但是,當我關閉數據庫後立即運行我的測試時,C3P0檢測到它並從池中刪除連接。爲了給你更清晰的畫面,下面是執行結果:

14:48:01 - 請求處理成功。處理時間:5毫秒。 14:48:02 - 請求已成功處理。處理時間:4毫秒。 14:48:03 - (此時數據庫已關閉)。 14:48:04 - java.net.ConnectException。 14:48:05 - 請求被拒絕。處理時間:258毫秒。 14:48:06 - 請求被拒絕。處理時間:1 ms。 14:48:07 - 請求被拒絕。處理時間:1 ms。

C3P0顯然知道數據庫關閉並從池中刪除連接。這可能需要一段時間,因爲關閉數據庫之後的第一個請求花費的時間比其他時間要長。我已經多次運行此測試,並且單個請求可能需要從1毫秒到3.5秒(這是超時時間)。此條目出現的次數與我爲我的池定義的連接數相同。爲了簡單起見,我省略了其餘的部分。

我認爲C3P0能夠立即從池中移除連接(在上面的例子中最快爲258毫秒)是很好的,但是我有麻煩解釋其他人爲什麼會這樣工作。如果「setTestConnectionOnCheckin」和「setTestConnectionOnCheckout」設置爲「false」,C3P0如何能夠知道連接變差?

即使將它們設置爲「true」,測試連接也應該嘗試對數據庫執行查詢(例如「從double中選擇1 + 1」)。我們的數據庫出現故障,不應該測試超時?換句話說,C3P0不應該花費3.5秒來確定連接已經壞了嗎?

非常感謝,提前。

回答

0

(道歉......這將是簡潔的,我是phonebound。)

1)即使沒有明確的連接測試已配置,C3P0測試,遇到異常而檢出的,以確定是否連接他們仍然適合合併。

2)如果DBMS不可用,好的JDBC驅動程序將很快拋出異常。沒有理由爲什麼這些內部連接測試應該很慢。

3)而不是輪詢未使用的連接,以避免等待檢查/新購置,您可以考慮設置配置參數checkoutTimeout。

祝你好運!