近一段时间,部门同事反映在使用mysql的过程出现数据库链接问题java
应用程序和数据库创建链接,若是超过8小时应用程序不去访问数据库,数据库就断掉链接 。这时再次访问就会抛出异常,以下所示:mysql
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
...
查了一下发现应用程序和mysql数据库创建链接,若是超过8小时应用程序不去访问数据库,数据库就断掉链接 。这时再次访问就会抛出异常。sql
关于mysql自动断开的问题研究结果以下,在mysql中有相关参数设定,当数据库链接空闲必定时间后,服务器就会断开等待超时的链接:
一、相关参数,红色部分
mysql> show variables like '%timeout%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| connect_timeout | 5 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
|interactive_timeout | 28800 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
|wait_timeout | 28800 |
+--------------------------+-------+
同一时间,这两个参数只有一个起做用。究竟是哪一个参数起做用,和用户链接时指定的链接参数相关,缺省状况下是使用wait_timeout。我建议是将这两个参数都修改,以避免引发没必要要的麻烦。数据库
二、修改参数
这两个参数的默认值是8小时(60*60*8=28800)。我测试过将这两个参数改成0,结果出人意料,系统自动将这个值设置为1。换句话说,不能将该值设置为永久。
将这2个参数设置为24小时(60*60*24=604800)便可。
set interactive_timeout=604800;
set wait_timeout=604800;服务器
也能够修改my.cof,修改后重起mysql
打开/etc/my.cnf,在属性组mysqld下面添加参数以下:
[mysqld]
interactive_timeout=28800000
wait_timeout=28800000app
若是一段时间内没有数据库访问则mysql自身将切断链接,以后访问java访问链接池时对数据库的数据通道早就关闭了,由于dbcp链接池没法时时维护与数据库的链接关系,mysql5之后即便在dbcp配置中加入autoReconnect=true也没有效果。ide
另一种解决办法是,经过链接池在空闲时自动从新链接解决这个问题,以下是hibernate链接池的实现方法:测试
<?xml version="1.0" encoding="UTF-8"?>