1)C3P0容錯和自動重連與如下配置參數有關:html
automaticTestTable 、connectionTesterClassName 、preferredTestQuery :表示測試方式,默認是採用 DatabaseMetaData.getTables()來測試connection的有效性,但能夠經過以上配置來定製化測試語句,經過其名字就很好理解其含義,無需過多解釋sql
2)應用端getConnection拋出exception時, C3P0會測試其connection的有效性,並根據狀態處理此connection,但應用端不會重調。數據庫
3)不管是網絡問題仍是遠端數據庫服務器,就算恢復正常後,客戶端pool內其已存在的connection都會失效,要保證應用端調用無誤,必須在checkout到應用端以前刷新這些無效connection後端
4)breakAfterAcquireFailure=false是關鍵。若是 breakAfterAcquireFailure=true ,一旦pool向數據庫請求鏈接失敗,就會標記pool block並關閉pool,這樣不管數據庫是否恢復正常,應用端都沒法從pool拿到鏈接服務器
5)要想保證網絡和數據庫瞬間的失效100%不會形成應用端getConnection失敗必須開啓 testConnectionOnCheckout。但此特性的代價巨大,建議在應用端作容錯。網絡
6)推薦使用 idleConnectionTestPeriod。能夠根據應用調用頻率權衡一個檢查pool的頻率,這樣能夠在保證性能損耗不大狀況下,儘量的保證pool內connection的有效性
異步
7)若嫌DatabaseMetaData.getTables()性能很差,能夠嘗試經過配置automaticTestTable、connectionTesterClassName、preferredTestQuery來找到一個性能最好的測試語句,只要能驗證connection有效就行性能
綜上所述,要想保證性能的前提下,本人推薦的配置組合以下:測試
breakAfterAcquireFailure: false
testConnectionOnCheckout: false
testConnectionOnCheckin: false
idleConnectionTestPeriod: 60
acquireRetryAttempts: 10
acquireRetryDelay: 1000
但須要注意的是以上的配置不能保證100%應用端getConnection無誤,若是應用端不能發生getConnection錯誤,須要自行考慮容錯和重試機制。ui
在以上配置下,當網絡或數據庫發生瞬間變更的狀況下,會有以下事情發生:
1)自動測試idleConnection的 task輪訓檢測pool,對每一個connction經過DatabaseMetaData.getTables()來測試有效性,並剔除無效鏈接。
2)根據請求狀況和配置,pool向數據庫請求新鏈接並加入池內
3)應用端getConnection->是否發生異常->若是發生異常,檢驗其有效性,並剔除出pool->若是沒有發生異常(自動檢查task以前已檢測),調用成功
以上是基於客戶端的重連機制,其實重連可讓服務端來作,效果更好~