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以前已检测),调用成功
以上是基于客户端的重连机制,其实重连可让服务端来作,效果更好~