昨天有运营说添加活动不能用了,我就看了一下后台日志,发现访问数据库是报错:html
at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,085,803 milliseconds ago.
The last packet sent successfully to the server was 59,085,806 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.GeneratedConstructorAccessor377.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3358) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1970) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
意思就是数据库有长链接,长时间没有使用数据库,而且空闲时间超过了数据库配置的wait_timeout设置的时间。到了wait_timeout的时间,数据库就会释放链接。通常的思路是,改数据库的wait_timeout时间,这个方法可行,可是并非最好的java
由于,mysql的最大超时时间是2147483。因此咱们的逻辑就要转到mysql连接来mysql
(1) JNDI数据源:sql
咱们使用的是jndi数据源配置如图:数据库
<Resource name="jdbc/assistMaster" type="javax.sql.DataSource" url="jdbc:mysql://weatherDB1:3308/assist" driverClassName="com.mysql.jdbc.Driver" username="adbconn1" password="6vjuN8qC" maxActive="30" maxIdle="10" maxWait="10000" />
须要添加以下的链接测试apache
validationQuery = "SELECT 1" testWhileIdle = "true" timeBetweenEvictionRunsMillis = "3600000" minEvictableIdleTimeMillis = "18000000" testOnBorrow = "true"
(2)jdbc数据源配置app
jdbc:mysql://10.10.10.10:3306/mydb?autoReconnect=true
(3)Spring中使用DBCP链接池,在定义datasource增长属性validationQuery和testOnBorrowide
<bean id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${countNew.jdbc.url}" />
<property name="username" value="${countNew.jdbc.user}" />
<property name="password" value="${countNew.jdbc.pwd}" />
<property name="validationQuery" value="SELECT 1" />
<property name="testOnBorrow" value="true"/>
</bean>
(4)测试
若是是在Spring中使用c3p0链接池,则在定义datasource的时候,添加属性testConnectionOnCheckin和testConnectionOnCheckout,如:ui
<bean name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${cache.url}"/>
<property name="user" value="${cache.user}"/>
<property name="password" value="${cache.password}"/>
<property name="initialPoolSize" value="10"/>
<property name="maxPoolSize" value="${cache.maxPoolSize}"/>
<property name="testConnectionOnCheckin" value="false"/>
<property name="testConnectionOnCheckout" value="true"/>
<property name="preferredTestQuery" value="SELECT 1"/>
</bean>
2.jndi数据源配置
(1) 什么是jndi
http://blog.csdn.net/liujiahan629629/article/details/20568475
http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html
http://blog.csdn.net/jiangguilong2000/article/details/12523771
http://blog.csdn.net/beijixingtianyake/article/details/49927761