版权声明:本文为hoaven原创文章,未经博主允许不得转载。 https://blog.csdn.net/hehuanchun0311/article/details/80591929
一、问题描述
[2018-6-5 13:57:11] [WARN ] [com.mchange.v2.c3p0.impl.NewPooledConnection:425] - [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
[2018-6-5 13:57:11] [WARN ] [com.mchange.v2.c3p0.impl.NewPooledConnection:426] - [c3p0] Another error has occurred [ com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. ] which will not be reported to listeners!
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:917)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1235)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1230)
at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4833)
at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.restoreOriginalAtributes(AttributeRestoringConnectionInvocationHandler.java:141)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.cleanupConnection(JobStoreSupport.java:3600)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3206)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.manage(JobStoreSupport.java:3935)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:3956)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
二、问题分析
c3p0
Mysql服务器默认的
“wait_timeout”
是8小时,也就是说一个connection
空闲超过8个小时,Mysql将自动断开该connection
。这就是问题的所在,在
C3P0 pools
中的connections
如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection
已经失效,如果这时有Client请求connection
,C3P0将该失效的Connection
提供给Client,将会造成上面的异常。而c3p0属性
<property name="maxIdleTime">60</property>
Quartz
quartz定时任务使用的是默认是maxIdleTime=0,永不丢弃。
从日志文件打印quartz数据库配置信息来看:
Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [
acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay ->
1000, autoCommitOnClose -> false, automaticTestTable -> null,
breakAfterAcquireFailure -> false, checkoutTimeout -> 0,
connectionCustomizerClassName -> null, connectionTesterClassName ->
com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName ->
1bqrhug9v1mimg6ddv5dda|8cf8fc3, debugUnreturnedConnectionStackTraces ->
false, description -> null, driverClass -> com.mysql.jdbc.Driver,
factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false,
identityToken -> 1bqrhug9v1mimg6ddv5dda|8cf8fc3, idleConnectionTestPeriod
-> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://cashbus-test-
vpc.mysql.rds.aliyuncs.com:3306/hdd?useUnicode=true&characterEncoding=utf-
8&zeroDateTimeBehavior=convertToNull, lastAcquisitionFailureDefaultUser ->
null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime
-> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 30, maxStatements
-> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1,
numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0,
preferredTestQuery -> null, properties -> {user=******, password=******},
propertyCycle -> 0, testConnectionOnCheckin -> false,
testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0,
usesTraditionalReflectiveProxies -> false ]
重点:maxIdleTime -> 0
三、解决方案
加上最大空闲时间,设置为60s
quartz的属性配置是
discardIdleConnectionsSeconds
:
org.quartz.dataSource.myDS.discardIdleConnectionsSeconds:60