c3p0连接池不释放连接问题

837 阅读2分钟

c3p0连接池不释放连接

将c3p0配置文件中加入

1.c3p0.max_statements=0 //设置最大的satement对象为0 有时连接已经关闭但是satement 还在被catch所以设置最大的空闲statement对象为0 用完即关。

2.适当加大maxPoolSize和minPoolSize  ,可以大大缓解这种情况 c3p0.maxPoolSize=5000c3p0.minPoolSize=10b.检测代码 close conn..释放conn...当然这个总是有遗漏.最小化这个影响就好

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

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

5.最后,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,这样的设置应该没有什么问题了。