[英]Tomcat JDBC Connection Pool: testOnBorrow vs testWhileIdle
由於各種原因,池中的連接可能變為無效:服務器連接超時,網絡問題......
我的理解是Tomcat JDBC連接池不保證它為應用程序提供的連接的有效性。
為了防止(實際上只降低風險)從池中獲得無效連接,解決方案似乎是連接驗證的配置。 驗證連接意味着在數據庫上運行非常基本的查詢(例如SELECT 1;
在MySQL上)。
Tomcat JDBC連接池提供了幾個測試連接的選項。 我發現兩個更有趣的是testOnBorrow
和testWhileIdle
。
首先,我認為testOnBorrow
是最好的選擇,因為它在將連接提供給應用程序之前基本上驗證了連接(具有由validationInterval
定義的最大頻率)。
但是經過一秒鍾后我才意識到在使用它之前測試連接可能會影響應用程序的響應能力。 所以我雖然使用testWhileIdle
可以更高效,因為它在不使用時測試連接。
無論我選擇哪個選項,它們似乎只會降低獲得無效連接的風險,但這種風險仍然存在。
所以我最后問:我應該使用testOnBorrow
還是testWhileIdle
或兩者兼而有之?
另外,我很驚訝validationInterval
不適用於testOnReturn
而且我沒有真正達到testOnConnect
的目的。
這沒有100%正確的答案。 這是一個權衡和背景的問題。
但考慮到這是一個角落案例, testOnBorrow給出了相當不錯的保證。
現在需要權衡的是,每次請求連接時,都會對數據庫服務器進行查詢(無論多么輕量級)。 這可能非常快,但成本仍然不是零。
如果你有一個繁忙的應用程序,具有非常好的數據庫連接可靠性,那么你將從數據開始看到,“對來自池的每個連接請求的有效性檢查”的成本超過檢測連接問題的好處。
它確保最大化,您在使用之前有良好的連接。 特別是考慮到失敗的DB操作的“無法輕松恢復”的成本(重試+手動干預+工作流程丟失等)。
現在想象一下,如果你有testOnIdle選項。 這需要您的連接在進行健全性檢查之前空閑(取決於連接的空閑超時)。
最后一個數據點是,對於某些應用程序,關鍵路徑不是“驗證查詢”時間(希望以較低的毫秒數)。 應用程序有更大的問題需要處理。 當然,對於某些應用來說,那個時間非常重要。
只是為了讓您知道,我剛剛對此進行了測試,並且可以同時使用testOnBorrow
和testOnIdle
屬性。
然而,如上所述,我將選擇testOnBorrow
唯一,因為我的應用程序沒有大量流量,並且能夠承擔在連接之前驗證連接。
正如評論中指出的那樣, testOnBorrow
不需要驗證查詢。 如果你確實選擇保留一個它可以是一個簡單的選擇:
jdbc.hive.testOnBorrow=true
jdbc.hive.validationQuery=SELECT 1
如果您希望使用testWhileIdle
,則可以使用以下命令:
jdbc.testWhileIdle=true
jdbc.minEvictableIdleTimeMillis=1800000
jdbc.timeBetweenEvictionRunsMillis=1800000`
有關DBCP的更多信息: https : //commons.apache.org/proper/commons-dbcp/configuration.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.