MySQL的八小时问题

当你对MySQL访问时间间隔超过八小时,那么你下次对数据库进行操作的时候,可能就能遇到这个问题:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)
  com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
  No operations allowed after statement closed.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)

原因

这是因为MySQL配置中有一个默认的参数“wait_timeout”。当客户端连接到MySQL数据库之后,如果客户不断开链接,也不做任何操作,那么MySQL会保留到“wait_timeout”(默认是8小时),如果超过八小时,那么MySQL自动优化,就断开了这个连接。

解决方案

那么怎么去解决呢?

第一种方式:修改MySQL配置

修改MySQL配置my.ini或者my.cnf,将wait_timeout的值设大一点,比如说28800000。
缺点:这个只是治标,MySQL最大能设21天,超过就不行了。

第二种方式:修改连接池配置

比如说修改c3p0的配置文件:

 # How long to keep unused connections around(in seconds)
 # Note: MySQL times out idle connections after 8 hours( 28 , 800 seconds)
 # so ensure this value is below MySQL idle timeout
 cpool.maxIdleTime = 25200

把连接的生命周期设的比较小。
缺点:连接失效太快,性能损耗。

第三种方式:使用前进行测试

比如说c3p0的testConnectionOnCheckOut=true
缺点:每次用都要测试,性能非常差。

第四种方式:投机取巧

写一个函数每八小时,自己访问数据库一次。
缺点:每八小时都要访问自己,如果业务繁忙,那性能就很损耗。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值