哈哈!这个问题在我们公司也发生过。经过几天研究终于搞定。
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. 第一点是最重要的,后两点是辅助的。
转自:http://www.oschina.net/question/242388_40477