使用BasicDataSource引发的数据库连接中断的问题和解决方法

mysql重连,连接丢失:The last packet successfully received

更多 0
mysql  连接  packet

1.1 错误信息:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 20,820,001 milliseconds ago.  The last packet sent successfully to the server was 20,820,002 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
		at sun.reflect.GeneratedConstructorAccessor29.newInstance(Unknown Source) ~[na:na]
		at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_51]
		at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_51]
		at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3988) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5372) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881) ~[c3p0-0.9.1.1.jar:0.9.1.1]
		at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98) ~[quartz-2.2.1.jar:na]

1.2 解决方法

- 如果使用的是JDBC,在JDBC URL上添加?autoReconnect=true,如:

jdbc:mysql://10.10.10.10:3306/mydb?autoReconnect=true

- 如果是在Spring中使用DBCP连接池,在定义datasource增加属性validationQuerytestOnBorrow,如:

 id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     name="driverClassName" value="${jdbc.driverClassName}" />
     name="url" value="${countNew.jdbc.url}" />
     name="username" value="${countNew.jdbc.user}" />
     name="password" value="${countNew.jdbc.pwd}" />
     name="validationQuery" value="SELECT 1" />
     name="testOnBorrow" value="true"/>

- 如果是在Spring中使用c3p0连接池,则在定义datasource的时候,添加属性testConnectionOnCheckintestConnectionOnCheckout,如:

 name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     name="driverClass" value="${jdbc.driver}"/>
     name="jdbcUrl" value="${cache.url}"/>
     name="user" value="${cache.user}"/>
     name="password" value="${cache.password}"/>
     name="initialPoolSize" value="10"/>
     name="maxPoolSize" value="${cache.maxPoolSize}"/>
     name="testConnectionOnCheckin" value="false"/>
     name="testConnectionOnCheckout" value="true"/>
     name="preferredTestQuery" value="SELECT 1"/>

参考

  • MySQL reconnect issues
注意:之前mysql环境是不会有这种问题的,新搭的环境会有这种问题,除了程序这边“解决”之外,最终的解决方案是:
mysql配置文件my.cf中,wait_timeout=180000。

你可能感兴趣的:(使用BasicDataSource引发的数据库连接中断的问题和解决方法)