解决MYSQL 8小时连接问题
之前在使用SSH开发项目的时候遇到了一个很奇怪的问题,部署到服务器上,运行一段时间后系统就崩溃了。
出现错误:org.hibernate.exception.JDBCConnectionException: could not execute query
在后在百度上查了下资料发现了问题所在,原来这个是传说中的8小时问题— —。
一、什么是8小时问题?Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在Hibernate默认连接池中的connections如果空闲超过8小时,Mysql将其断开,而Hibernate默认连接池并不知道该connection已经失效,如果这时有 Client请求connection,Hibernate默认连接池将该失效的Connection提供给Client,将会造成上面的异常。
二、解决的方法1. 增加 MySQL 的 wait_timeout 属性的值。修改 /etc/# Set a connection to wait wait_timeout = 86400或者在MySQL中使用SQL语句:set global interactive_timeout=86400;
set global wait_timeout= 86400;
相关网络资料:
wait_timeout 的设置出现警告,再看看设置后的结果
也就是说wait_timeout的最大值只允许2147483 (24天左右)
2. 减少连接池内连接的生存周期,使之小于上一项中所设置的 wait_timeout 的值。修改 c3p0 的配置文件,设置:
# How long to keep unused connections around(in seconds)在 Spring 的配置文件中:
c3p0连接池的配置方法:
修改 c3p0 的配置文件,设置:
# Prevent cpool.preferredTestQuery='SELECT 1'cpool.idleConnectionTestPeriod=18000cpool.testConnectionOnCheckout=true
修改 Spring 的配置文件:
c3p0连接池的配置方法:
proxool连接池的配置方法:
http://blog.csdn.net/risingsun001/article/details/12197715
注:网上所说的 设置 "autoReconnect=true" 的方法,测试无效,