paip.提升稳定性---c3p0数据库连接池不能取到连接An attempt by a client to checkout a Connection has timed out

作者Attilax  艾龙,  EMAIL:[email protected]
来源:attilax的专栏
地址:http://blog.csdn.net/attilax

最开始,卡死,不动了,,使用jprofile, thread dump...原来是在getconn()在wait..默认

添加设置
# 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出    
# SQLException,如设为0则无限期等待。单位毫秒,默认为0
c3p0.checkoutTimeout=10000

此时,取得conn不到报错。c3p0连接错误 An attempt by a client to checkout a Connection has timed out


----根本原因: 池中的连接已经被全部使用完了..达到了最大maxconn...从而导治这个错误...

----其他原因:忘记close conn,或者异常了而没有close conn,没有释放conn从池中。。...导治池中的conn满的了...


、、、、、解决方法:  
a.适当加大maxPoolSize和minPoolSize  ,可以大大缓解这种情况。。
c3p0.maxPoolSize=5000
c3p0.minPoolSize=10

b.检测代码 close conn..释放conn...当然这个总是有遗漏.最小化这个影响就好..

c.自动超时回收Connection (强烈推荐)
c3p0.unreturnedConnectionTimeout=25
default : 0 单位 s
为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收
Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭
情况的不是很适用。为0不对connection进行回收,即使它并没有关闭。

d.配置超时自动断开conn (推荐)
c3p0.maxIdleTimeExcessConnections=20
c3p0.maxConnectionAge=20
default : 0 单位 s
配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待
它close再断开。配置为0的时候则不会对连接的生存时间进行限制。



e.最后,show full processlist  ..查看db conn数,,稳定后走ok...否则适当调整以上参数..


------------还有一种说法。c3p0.max_statements 设置成0 可以解决。时间忙,没有验证。。。

网上很多说是C3P0的bug问题。c3p0在同时关闭statement和connection的时候,或者关闭他们之间的时间很短的时候,有时候connection并没有被关闭,因为有些preparedstatement还在被cached住。这样就会有很多connection并没有真正的被关闭,连接池的连接都给耗尽了,就会产生上面的异常。解决的方案就是把缓存关闭也就是把c3p0.max_statements 设置成0,这样就不会有缓存的preparedstatement,而设置的c3p0.idle_test_period又小于c3p0.timeout,这样的设置应该没有什么问题了。