背景
前段時間做系統壓測,發現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保證,如果獲取到了不可用的數據庫連接,一般由應用處理異常。