天天看點

資料庫連接配接池配置 testOnBorrow

前段時間做系統壓測,發現DB的CPU使用率飙升很嚴重,排查後發現是一個配置testOnBorrow由false修改為true導緻。怎麼對性能影響這麼大?需要好好了解一下。

testOnBorrow:如果為true(預設為false),當應用向連接配接池申請連接配接時,連接配接池會判斷這條連接配接是否是可用的。

假如連接配接池中的連接配接被資料庫關閉了,應用通過連接配接池ge tConnection時,都可能擷取到這些不可用的連接配接,且這些連接配接如果不被其他線程回收的話;它們不會被連接配接池廢除,也不會重新被建立,占用了連接配接池的名額,項目如果是服務端,資料庫連結被關閉,用戶端調用服務端就會出現大量的timeout,用戶端設定了逾時時間,會主動斷開,服務端就會出現close_wait。

常用資料庫:使用${DBNAME}ValidConnectionChecker進行判斷,比如Mysql資料庫,使用MySqlValidConnectionChecker的isValidConnection進行判斷

其他資料庫:則使用validationQuery判斷

驗證不通過則會直接關閉連接配接,并重新從連接配接池擷取下一條連接配接。

1.testOnBorrow能夠確定我們每次都能擷取到可用的連接配接,但是如果設定為true,則每次擷取連接配接時候都要到資料庫驗證連接配接有效性,這在高并發的時候會造成性能下降,可以将testOnBorrow設定成false,testWhileIdle設定成true這樣能獲得比較好的性能。

2.testOnBorrow和testOnReturn在生産環境一般是不開啟的,主要是性能考慮。失效連接配接主要通過testWhileIdle保證,如果擷取到了不可用的資料庫連接配接,一般由應用處理異常。

詳見:https://www.jianshu.com/p/edb6a91285be

作者:AmyZYX

出處:http://www.cnblogs.com/amyzhu/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。