last modified:2013-10-08 16:34:22
**********************************************
今天将测试服务器上测试通过的系统发布到线上,刚开始是出现一个mysql数据连接超时的错误,后来修改一下连接池的配置文件问题解决了,但是重新启动服务器确又报了一个新的错误:
2013-10-08 14:51:58 DEBUG [C3P0PooledConnectionPool.java:468] com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.destroyResource() - Preparing to destroy PooledConnection: com.mchange.v2.c3p0.impl.NewPooledConnection@4574aee5 2013-10-08 14:51:58 DEBUG [NewPooledConnection.java:491] com.mchange.v2.c3p0.impl.NewPooledConnection.close() - com.mchange.v2.c3p0.impl.NewPooledConnection@4574aee5 closed by a client. java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:491) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:191) 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)
在网上查了许多资料总结如下:这是一个提示而已,提示数据库连接池里面的连接已经关闭,使用异常形式输出是为了让程序员debug是能看到连接池里连接关闭的效果!如果要屏蔽这个错误,只要将log的输出级别改为info就可以了。
网上查的资料具体如下:
//跟踪错误代码,发现 是 c3p0 内部的异常输出 //C3p0 相关源码 : com.mchange.v2.c3p0.impl. NewPooledConnection public synchronized void close() throws SQLException{ close( null ); } private void close( Throwable cause ) throws SQLException{ close( cause, false ); } private void close( Throwable cause, boolean forced ) throws SQLException{ //。。。。。。。。。。。。。。。。 /********************出错位置************************/ if ( cause == null ){ this .invalidatingException = NORMAL_CLOSE_PLACEHOLDER ; if ( Debug.DEBUG && logger .isLoggable( MLevel.FINEST ) ) logger .log( MLevel.FINEST , this + " closed by a client.", new Exception("DEBUG -- CLOSE BY CLIENT STACK TRACE") ); logCloseExceptions ( null , closeExceptions ); if (closeExceptions.size() > 0) throw new SQLException("Some resources failed to close properly while closing " + this ); /*********************************************************/ }else{ this .invalidatingException = cause; if (Debug.TRACE >= Debug.TRACE_MED ) logCloseExceptions ( cause, closeExceptions ); else logCloseExceptions ( cause, null ); } } }
原因:
由于Mysql服务器默认的wait_timeout是8小时,也就是说一个connection空闲超过8个小时,
Mysql将自动断开该 connection。然而在C3P0 pools中的connections如果空闲超过8小时,
Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,
C3P0将该失效的Connection提供给Client,将会造成异常。
但是以上的解答不是完全的,后来在百度上看到一篇专门介绍这个bug的文章,感觉比较靠谱:
转自:http://hi.baidu.com/xhr8334/item/7e5a6f5326aa02d5d48bacca