2015-09-28 16 views
0

看起來我們可以通過在org.apache.commons.dbcp2.BasicDataSource上設置testOnBorrow=false來提高我們的性能。但是有什麼風險?通過設置BasicDataSource屬性testOnBorrow = false來提高Web應用程序/ rest-api性能,是否有風險?

default setting爲真。

因此,使用默認值,每次從連接池中檢索連接時,都會針對數據庫執行驗證查詢以測試數據庫是否有效。雖然該查詢可能會很快運行(通常,「select 1」是查詢)。它仍然涉及將數據發送到數據庫(通常在另一臺服務器上)並將結果讀回。這需要時間,也許只有50ms,但是,如果沒有必要,爲什麼會這樣呢?

爲了提高性能,我正在考慮設置testOnBorrow=false, testOnReturn=true, testOnCreate =true, testWhileIdle=true。而不是默認值。

因此,通過這種設置,看起來風險在於連接可能「變壞」,而您的數據庫查詢失敗。但爲什麼會發生?特別是對於testOnReturn和testWhileIdle,似乎風險很小。什麼可能導致連接在此設置中變壞?

+0

任何事情。從功能角度來看,您必須準備好在任何時候關閉連接而沒有明顯的原因。這也意味着在借用它時檢查連接在功能意義上是無用的。但是從性能角度來看,你必須要問的是:最後一次空閒測試和第一個查詢之間的連接可能會下降的可能性有多大?這將取決於很多事情。而且,持續的空閒測試會導致多少開銷,而不是每次借用一次。 – biziclop

回答

1

請注意,正確性和性能都是理想的屬性。在實踐中,陳舊的連接是真正的問題,我們經常需要DBA /系統管理員來協助。正如您所暗示的那樣,連接損壞不應該發生,但是由於網絡條件而發生。

使用驗證查詢有助於快速識別損壞的連接並將其從池中丟棄。這將最終允許將新的連接對象添加到池中。這種自動恢復過程比IMO更理想。