昨天有運營說添加活動不能用了,我就看了一下後臺日誌,發現訪問數據庫是報錯: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