I am getting the dreaded MySQL JDBC stale connection exceptions:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 243,263,541 milliseconds ago. The last packet sent successfully to the server was 243,263,541 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.
It seems like everyone agrees that this is fixed by using validationQuery + testOnBorrow, but this is not solving the problem.
I am using the following software
MySQL 5.1.41-3ubuntu12.10
Connector/J 5.1.18
Tomcat 6.0.24
Here is how the connection is defined in server.xml, we are using the tomcat-dbcp to pool the connections.
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
logAbandoned="true"
maxActive="75"
maxIdle="20"
maxWait="10000"
name="jdbc/jndiname"
password="password"
removeAbandoned="true"
removeAbandonedTimeout="60"
validationQuery="/* ping */SELECT 1"
testOnBorrow="true"
testOnReturn="true"
timeBetweenEvictionRunsMillis="10000"
testWhileIdle="true"
scope="Shareable"
type="javax.sql.DataSource"
url="jdbc:mysql://host:3306/schema"
username="username" />
I might check the wait_timeout in your my.cnf file. The default is 28800 seconds or 8 hours. It has a max of 31536000 seconds or 365 days.
For the first exception you note:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException, I have in the past wrapped that in a try/catch block. In the catch, for that exception, I had the connection reconnect, and then resent the query. In knowing that I didn’t want to have to do that very often, and still maintain an open connection, I also increased the default wait_timeout to something reasonable for my application.See the manual reference at: http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout