簡體   English   中英

C3P0連接的運行狀況檢查

[英]C3P0 connections' health checks

我希望有關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毫秒。 14:48:07-請求被拒絕。 處理時間:1毫秒。

C3P0顯然知道數據庫已關閉並從池中刪除了連接。 可能要花一些時間,因為關閉數據庫后的第一個請求比其他請求花費了更長的時間。 我已經多次運行該測試,單個請求可能需要1毫秒到3.5秒(這是超時時間)。 此項的顯示次數與我為池定義的連接數相同。 為了簡單起見,我省略了所有其他內容。

我認為C3P0能夠立即從池中刪除連接(這在上述示例中最快258毫秒)是很不錯的,但是我很難向其他人解釋為什么這樣做有效。 如果將“ setTestConnectionOnCheckin”和“ setTestConnectionOnCheckout”設置為“ false”,那么C3P0如何知道連接不良?

即使將它們設置為“ true”,也應該測試連接以嘗試在數據庫上執行查詢(類似於“從double中選擇1 + 1”)。 我們數據庫崩潰了,測試超時不應該嗎? 換句話說,C3P0是否不應該花3.5秒來確定連接已損壞?

非常感謝,提前。

(抱歉,這很簡短,我被綁定了電話。)

1)即使未配置任何顯式的連接測試,c3p0也會對在簽出時遇到異常的連接進行測試,以確定它們是否仍適用於合並。

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

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

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM