c3p0 and MySQL connection lost after 8 hours

本文讨论了在使用C3P0数据库连接池时遇到的连接断开问题,以及如何通过调整配置参数解决连接有效性问题。通过设置`preferredTestQuery`、`maxIdleTime`和`testConnectionOnCheckout`来防止过时连接被使用,并避免了异常`DEBUG--CLOSEBYCLIENT`的出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到了这样的一个问题,使用了c3p0数据库连接池,连接池中的连接在第二天使用“show processlist;”检查时全部断掉了。

Application在执行sql时,报出“communication failure with Mysql database”异常。

查询了下,发现mysql的默认wait_timeout是8小时,c3p0中可以在checkout connection时检查连接的有效性,如果是过时(stale)的连接,就把该连接清掉,然后建立新的连接。

具体参考如下:

1. http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

2. http://jimlaren.iteye.com/blog/137103

3. http://osbi.nl/2009/09/pentaho-and-mysql-connection-lost-after-8-hours/

4. http://soft-app.iteye.com/blog/921828

最终选定的参数组合是

//set to 'SELECT 1'       
preferredTestQuery = 'SELECT 1'         
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out    
maxIdleTime = 25000     
//if you can take the performance 'hit', set to "true"    
testConnectionOnCheckout = true  

但是发现了新的异常,

08/Nov/2011 03:35:00, {com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1} - DEBUG NewPooledConnection : com.mchange.v2.c3p0.impl.NewPooledConnection@41ab11b0 closed by a client
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRAC
        at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566)

        at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)

        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)

        at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)

        at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)


从http://forum.springsource.org/archive/index.php/t-47689.html 可知,把log4j的level从DEBUG改成INFO,异常就不会报出了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值