tomcat+mysql部署,每天早晨第一次訪問web項目,出現mysql的連接timeout異常:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException或com.atomikos.datasource.ResourceException。
############################################################################ com.atomikos.datasource.ResourceException: XA resource 'center': resume for XID '3139322E3136382E312E35332E746D30303030363030303530:3139322E3136382E312E35332E746D37' raised 0: unknown com.mysql.jdbc.jdbc2.optional.MysqlXAException: The last packet successfully received from the server was 50,024,067 milliseconds ago. The last packet sent successfully to the server was 50,024,068 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. ############################################################################ The error occurred while applying a parameter map. --- Check the ts_user.ibatorgenerated_selectByExample-InlineParameterMap. --- Check the statement (query failed). --- Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 232,007,469 milliseconds ago. The last packet sent successfully to the server was 232,007,485 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.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred while applying a parameter map. --- Check the ts_user.ibatorgenerated_selectByExample-InlineParameterMap. --- Check the statement (query failed). --- Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 232,007,469 milliseconds ago. The last packet sent successfully to the server was 232,007,485 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.
原因
mysql5連接的等待時間(wait_timeout)默認是8小時。
查看方法
show global variables like 'wait_timeout';
查看結果:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
在wait_timeout時間里,mysql的connection處於等待狀態,過了這時間mysql5就關閉了,但是java application的連接池仍然有合法的connection,當你再操作數據庫時,就會出現這樣的問題。
解決方法
mysql5之前的版本,可以在jdbc連接的url中加入:autoReconnect = true
mysql5中wait_timeout在window中最大為24天,在linux中最大為365天。
a、修改配置
如果在window中設置為21天,改mysql5的安裝文件夾中的my.ini
如果在linux中/etc/my.cnf,添加一行:wait_timeout = 1814400,重啟mysql,添加效果如下:

b、直接用sql命令行修改(重啟有還原為28800,不推薦)
mysql> set global wait_timeout=1814400; mysql> show global variables like 'wait_timeout';
查看mysql版本
select version();
