关于c3p0 ResourcePoolException: Attempted to use a closed or broken resource pool

转自:https://blog.csdn.net/u011404265/article/details/52848603spring

springmvc-servlet.xml加入sql

<property name="acquireRetryAttempts"> <value>30</value> 数据库

</property> 后端

<property name="acquireRetryDelay"> <value>100</value>服务器

</property> 网络

<property name="breakAfterAcquireFailure"> <value>false</value> mvc

</property>异步

出现该问题的缘由是c3p0的自动重连机制:

一、C3P0容错和自动重连与如下配置参数有关:

  1. breakAfterAcquireFailure :true表示pool向数据库请求链接失败后标记整个pool为block并close,就算后端数据库恢复正常也不进行重连,客户端对pool的请求都拒绝掉。false表示不会标记 pool为block,新的请求都会尝试去数据库请求connection。默认为false。所以,若是想让数据库和网络故障恢复以后,pool能继续请求正常资源必须把此项配置设为false。
  2. idleConnectionTestPeriod :C3P0会有一个Task检测pool内的链接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测。
  3. testConnectionOnCheckout :true表示在每次从pool内checkout链接的时候测试其有效性,这是个同步操做,所以应用端的每次数据库调用,都会先经过测试sql测试其有效性,若是链接无效,会关闭此链接并剔除出pool,并尝试从pool内取其余链接,默认为false,此特性要慎用,会形成至少多一倍的数据库调用。
  4. testConnectionOnCheckin :true表示每次把链接checkin到pool里的时候测试其有效性,由于是个过后操做,因此是异步的,应用端不须要等待测试结果,但一样会形成至少多一倍的数据库调用。
  5. acquireRetryAttempts 和acquireRetryDelay :pool请求取链接失败后重试的次数和重试的频率。请求链接会发生在pool内链接少于min值或则等待请求数>池内能提供的链接数。
  6. automaticTestTable 、connectionTesterClassName 、preferredTestQuery :表示测试方式,默认是采用 DatabaseMetaData.getTables()来测试connection的有效性,但能够经过以上配置来定制化测试语句,经过其名字就很好理解其含义,无需过多解释。
  7. maxIdleTime 和 maxConnectionAge :表示connection的时效性,maxIdleTime和maxConnectionAge不一样之处在于, maxIdleTime表示idle状态的connection能存活的最大时间,而 maxConnectionAge表示 connection能存活的绝对时间

二、应用端getConnection抛出exception时, C3P0会测试其connection的有效性,并根据状态处理此connection,但应用端不会重调。

三、不管是网络问题仍是远端数据库服务器,就算恢复正常后,客户端pool内其已存在的connection都会失效,要保证应用端调用无误,必须在checkout到应用端以前刷新这些无效connection

四、breakAfterAcquireFailure=false是关键。若是 breakAfterAcquireFailure=true ,一旦pool向数据库请求链接失败,就会标记pool block并关闭pool,这样不管数据库是否恢复正常,应用端都没法从pool拿到链接

五、要想保证网络和数据库瞬间的失效100%不会形成应用端getConnection失败必须开启 testConnectionOnCheckout。但此特性的代价巨大,建议在应用端作容错。

六、推荐使用 idleConnectionTestPeriod。能够根据应用调用频率权衡一个检查pool的频率,这样能够在保证性能损耗不大状况下,尽量的保证pool内connection的有效性

七、若嫌DatabaseMetaData.getTables()性能很差,能够尝试经过配置automaticTestTable、connectionTesterClassName、preferredTestQuery来找到一个性能最好的测试语句,只要能验证connection有效就行

综上所述,要想保证性能的前提下,本人推荐的配置组合以下:

breakAfterAcquireFailure: false testConnectionOnCheckout: false testConnectionOnCheckin: false idleConnectionTestPeriod: 60 acquireRetryAttempts: 10 acquireRetryDelay: 1000
相关文章
相关标签/搜索