c3p0搞的连接池怎么老是死掉啊

tidezyc 发布于 2012/03/04 22:51
阅读 13K+
收藏 6
用c3p0搞了个mysql的连接池,应该给新手用的,没有hibernate和spring,直接赤裸裸的C3p0,连接几次之后会死掉,情况和连接数用完一样?
加载中
0
徐一峰
徐一峰

哈哈!这个问题在我们公司也发生过。经过几天研究终于搞定。

c3p0的connection实现类和我们想象中有出入,最大的出入就是c3p0的connection实现类的close方法不是真的将该链接释放掉,而是将这个链接回收到可用连接池中。于是问题就来了。

c3p0的有一个maxConnection的参数,即最多链接数。还有一个genratNum,即当链接不够用的时候自动每次生成链接的个数。假如将最大连接数设定为50,每次增长数设定为10,初始值为10。假如当前总共产生的链接数已经有49个,但是这49个链接不是可用连接数,那么c3p0就会增长10个。这样一共就产生了59个。

假如你设定最大空闲时间又过长,如一个月,那么就是被close的链接,也不会被释放掉,一直保留链接池中。

所以很快c3p0就将数据库的链接用完。

 

解决办法是:

    1. 在代码中当创建了一个connection(或者从池中取),必须在要在合适的时机将该链接close掉。

    2. 合理配置最大连接数,最大空闲时间,每次增长数

    3. 可以通过实行ConnectionCustomer接口,来显式的对链接进行关闭,释放资源的操作。

    4. 第一点是最重要的,后两点是辅助的。

tidezyc
tidezyc
太感谢了
0
鉴客
鉴客
这样的话,应该是没有释放连接哦,检查代码吧
鉴客
鉴客
@NullResult : 必须的!conn必须释放,这是告诉连接池说这个连接我已经不用了,可以回收了
tidezyc
tidezyc
一定得手动释放吗?
0
xmdeepdata
xmdeepdata
c3p0有bug,配置要检查下,自己在baidu找找吧。
tidezyc
tidezyc
@yzjiang : 应该不是mysql的问题,应该是c3p0的问题
xmdeepdata
xmdeepdata
@NullResult : 还有一种情况,默认配置下,Mysql过一段时间不连接,会自动中断服务。可以检查下是不是Mysql的配置问题。 还有就是应该把debug开起来,看日志,真正的原因要通过日志来了解。
tidezyc
tidezyc
配置检查多次,之前就是配置问题出错,现在改好了还是有问题,在不行就hibernate了
0
tidezyc
tidezyc

引用来自“徐一峰”的答案

哈哈!这个问题在我们公司也发生过。经过几天研究终于搞定。

c3p0的connection实现类和我们想象中有出入,最大的出入就是c3p0的connection实现类的close方法不是真的将该链接释放掉,而是将这个链接回收到可用连接池中。于是问题就来了。

c3p0的有一个maxConnection的参数,即最多链接数。还有一个genratNum,即当链接不够用的时候自动每次生成链接的个数。假如将最大连接数设定为50,每次增长数设定为10,初始值为10。假如当前总共产生的链接数已经有49个,但是这49个链接不是可用连接数,那么c3p0就会增长10个。这样一共就产生了59个。

假如你设定最大空闲时间又过长,如一个月,那么就是被close的链接,也不会被释放掉,一直保留链接池中。

所以很快c3p0就将数据库的链接用完。

 

解决办法是:

    1. 在代码中当创建了一个connection(或者从池中取),必须在要在合适的时机将该链接close掉。

    2. 合理配置最大连接数,最大空闲时间,每次增长数

    3. 可以通过实行ConnectionCustomer接口,来显式的对链接进行关闭,释放资源的操作。

    4. 第一点是最重要的,后两点是辅助的。

很好啊,我这就去试试,太感谢了!
0
JavaGG
JavaGG
可否发代码来看看,我用的c3p0好象没有这问题,我是和dbutils结合使用
0
l
leenavy

请问一下: c3p0的连接池,需不需要手动 关闭连接了, 我看 spring里面,hibernate,和spring jdbc都没有 用到手动关闭 连接或者 session, 而直接用jdbc ,需要关闭连接! 求解释!

0
编号5173
编号5173

能否把解决方案共享一下!谢谢!

0
b
bauhaus
解决了吗?我使用也是close也无法释放,慢慢就连接耗尽了
tidezyc
tidezyc
现在已经不用c3p0了,改用druid了
返回顶部
顶部