鍍金池/ 問答/Java  數(shù)據(jù)庫  網(wǎng)絡(luò)安全  HTML/ 數(shù)據(jù)庫連接池的testOnborrow在生產(chǎn)環(huán)境中到底要不要開啟?

數(shù)據(jù)庫連接池的testOnborrow在生產(chǎn)環(huán)境中到底要不要開啟?

開啟影響性能,但是不開啟,如果出現(xiàn)異常的連接,有可能不能及時(shí)被回收,導(dǎo)致系統(tǒng)線程被占用然后掛掉。譬如https://blog.csdn.net/lx34832...

回答
編輯回答
孤酒

你好,生產(chǎn)環(huán)境中一般不開啟。

TestOnBorrow=false時(shí),由于不檢測(cè)池里連接的可用性,于是假如連接池中的連接被數(shù)據(jù)庫關(guān)閉了,應(yīng)用通過連接池getConnection時(shí),都可能獲取到這些不可用的連接,且這些連接如果不被其他線程回收的話,它們不會(huì)被連接池被廢除,也不會(huì)重新被創(chuàng)建,占用了連接池的名額。

當(dāng)TestOnBorrow=true時(shí),有兩種情況:

1.集群某實(shí)例宕掉時(shí),如果連接剛好不處于通信階段,tcp連接正處于CLOSE_WAIT狀態(tài)或已關(guān)閉,當(dāng)應(yīng)用通過連接池getConnection時(shí),在borrow時(shí)會(huì)檢測(cè)連接,由于連接已關(guān)閉,于是報(bào)了如下報(bào)錯(cuò),并重新建立新連接,此時(shí)的新連接到集群的其他實(shí)例上了。后面能正常通信。

2.集群某實(shí)例宕掉時(shí),如果連接剛好處于通信階段,由于客戶端無法立即感知服務(wù)端已斷連接,它可能會(huì)報(bào)如下錯(cuò)誤,等待服務(wù)端的響應(yīng)超時(shí)報(bào)錯(cuò)。當(dāng)應(yīng)用通過連接池getConnection時(shí),在borrow時(shí)會(huì)檢測(cè)連接,由于連接已關(guān)閉,于是報(bào)了如下報(bào)錯(cuò),并重新建立新連接,此時(shí)的新連接到集群的其他實(shí)例上了。后面能正常通信。


  1. testOnBorrow和testOnReturn在生產(chǎn)環(huán)境一般是不開啟的,主要是性能考慮。失效連接主要通過testWhileIdle保證,如果獲取到了不可用的數(shù)據(jù)庫連接,一般由應(yīng)用處理異常。
  2. 對(duì)于常規(guī)的數(shù)據(jù)庫連接池,testOnBorrow等配置參數(shù)的含義和最佳實(shí)踐可以參考官方文檔。
2018年5月15日 10:39