配置文件c3p0-config.xml中加入:
true
1
debugUnreturnedConnectionStackTraces 默认为false,如果此参数设置为true,当所有连接用完的时候,会以堆栈信息显示哪些代码使用
了连接。由于跟踪连接状态会产生额外的消耗,如果程序稳定,应该将此参数恢复为默认值false。
unreturnedConnectionTimeout 设置连接被checkout后,经过多长时间还未返还连接池,则连接缓冲池直接Kill该连接
设置完成后重现错误,可以观察到堆栈信息如下:
java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace.
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:506)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at com.xinge.mms.push.jdbc.C3p0ConnectionProvider.getMms2Connection(C3p0ConnectionProvider.java:47)
at com.xinge.mms.push.manager.DBMms2Manager.isDetail(DBMms2Manager.java:78)
at com.xinge.mms.push.handler.IosMessageHandler.getAlert(IosMessageHandler.java:83)
at com.xinge.mms.push.handler.IosMessageHandler.sendMessage(IosMessageHandler.java:70)
at com.xinge.mms.push.apnstask.IosMessageProcessor4Test.run(IosMessageProcessor4Test.java:59)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
从中可以看到DBMms2Manager.isDetail(DBMms2Manager.java:78),查看代码发现,其中获取连接使用完后未关闭,从而造成连接泄漏