关于C3P0容错和自动重连特性的研究
為什么80%的碼農都做不了架構師?>>> ??
最近常有數據庫和網絡設備升級和搬遷等事情,而各個應用都是基于數據庫連接池做的,大部分都是基于C3P0,數據庫或網絡狀況的變動都會導致客戶端連接池中的connection失效,如何剔除這些blocked connection就和C3P0的各個配置息息相關。這兩天,搭了個實驗環境,根據C3P0的配置說明?和實驗結果,把C3P0關于這塊的機制解析了一番。先看看我的結論:
1)C3P0容錯和自動重連與以下配置參數有關:
- breakAfterAcquireFailure?:true表示pool向數據庫請求連接失敗后標記整個pool為block并close,就算后端數據庫恢復正常也不進行重連,客戶端對pool的請求都拒絕掉。false表示不會標記?pool為block,新的請求都會嘗試去數據庫請求connection。默認為false。因此,如果想讓數據庫和網絡故障恢復之后,pool能繼續請求正常資源必須把此項配置設為false
- idleConnectionTestPeriod?:C3P0會有一個Task檢測pool內的連接是否正常,此參數就是Task運行的頻率。默認值為0,表示不進行檢測。
- testConnectionOnCheckout?:true表示在每次從pool內checkout連接的時候測試其有效性,這是個同步操作,因此應用端的每次數據庫調用,都會先通過測試sql測試其有效性,如果連接無效,會關閉此連接并剔除出pool,并嘗試從pool內取其他連接,默認為false,此特性要慎用,會造成至少多一倍的數據庫調用。
- testConnectionOnCheckin?:true表示每次把連接checkin到pool里的時候測試其有效性,因為是個事后操作,所以是異步的,應用端不需要等待測試結果,但同樣會造成至少多一倍的數據庫調用。
- acquireRetryAttempts?和acquireRetryDelay?:pool請求取連接失敗后重試的次數和重試的頻率。請求連接會發生在pool內連接少于min值或則等待請求數>池內能提供的連接數
automaticTestTable?、connectionTesterClassName?、preferredTestQuery?:表示測試方式,默認是采用DatabaseMetaData.getTables()來測試connection的有效性,但可以通過以上配置來定制化測試語句,通過其名字就很好理解其含義,無需過多解釋
- maxIdleTime?和?maxConnectionAge?:表示connection的時效性,maxIdleTime和maxConnectionAge不同之處在于,?maxIdleTime表示idle狀態的connection能存活的最大時間,而?maxConnectionAge表示connection能存活的絕對時間
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錯誤,需要自行考慮容錯和重試機制。
在以上配置下,當網絡或數據庫發生瞬間變動的情況下,會有如下事情發生:
1)自動測試idleConnection的?task輪訓檢測pool,對每個connction通過DatabaseMetaData.getTables()來測試有效性,并剔除無效連接。
2)根據請求情況和配置,pool向數據庫請求新連接并加入池內
3)應用端getConnection->是否發生異常->如果發生異常,檢驗其有效性,并剔除出pool->如果沒有發生異常(自動檢查task之前已檢測),調用成功
轉載于:https://my.oschina.net/jsan/blog/34968
總結
以上是生活随笔為你收集整理的关于C3P0容错和自动重连特性的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网规:第4章 网络安全-4.5IDS和I
- 下一篇: error LNK2001: unres