1、當TestOnBorrow=false時
生產環境連接池TestOnBorrow設置為false,導致有時獲取的連接不可用。
TestOnBorrow=false時,由於不檢測池里連接的可用性,於是假如連接池中的連接被數據庫關閉了,應用通過連接池getConnection時,都可能獲取到這些不可用的連接,且這些連接如果不被其他線程回收的話,它們不會被連接池被廢除,也不會重新被創建,占用了連接池的名額。
2、當TestOnBorrow=true時
有兩種情況:
① 集群某實例宕掉時,如果連接剛好不處於通信階段,tcp連接正處於CLOSE_WAIT狀態或已關閉,當應用通過連接池getConnection時,在borrow時會檢測連接,由於連接已關閉,於是報了如下報錯,並重新建立新連接,此時的新連接到集群的其他實例上了。后面能正常通信。
② 集群某實例宕掉時,如果連接剛好處於通信階段,由於客戶端無法立即感知服務端已斷連接,它可能會報如下錯誤,等待服務端的響應超時報錯。當應用通過連接池getConnection時,在borrow時會檢測連接,由於連接已關閉,於是報了如下報錯,並重新建立新連接,此時的新連接到集群的其他實例上了。后面能正常通信。