數據庫連接池配置 testOnBorrow


背景

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

testOnBorrow含義

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

testOnBorrow=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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM