1. 程式人生 > >使用BasicDataSource引發的資料庫連線中斷的問題和解決方法

使用BasicDataSource引發的資料庫連線中斷的問題和解決方法

1.1 錯誤資訊:

Causedby: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Thelast packet successfully received from the server was 20,820,001 milliseconds ago.Thelast 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 usein your application, increasing the server configured values for client timeouts,orusing the Connector/J connection property'autoReconnect=true' to avoid this problem. at sun.reflect.GeneratedConstructorAccessor29.newInstance(UnknownSource)~[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,如:

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

- 如果是在Spring中使用c3p0連線池,則在定義datasource的時候,新增屬性testConnectionOnCheckintestConnectionOnCheckout,如:

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

參考

注意:之前mysql環境是不會有這種問題的,新搭的環境會有這種問題,除了程式這邊“解決”之外,最終的解決方案是: mysql配置檔案my.cf中,wait_timeout=180000。