mysql 8小时空闲后链接超时的问题

近一段时间,部门同事反映在使用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"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<!-- proxool别名 -->
<alias>product</alias>
<!-- 数据库链接Url -->
<driver-url>jdbc:mysql://db:3306/product?useUnicode=true&amp;characterEncoding=utf8</driver-url>
<!-- JDBC驱动名称 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 数据库链接账卿-->
<driver-properties>
<property name="user" value="chinawidth" />
<property name="password" value="123456" />
</driver-properties>
<!-- proxool自动侦察各个链接状态的时间间隔(毫秒),侦察到空闲的链接就立刻回撿超时的销歿-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空闲链接能够分配而在队列中等候的最大请求数,超过这个请求数的用户链接就不会被接受 -->
<maximum-new-connections>20</maximum-new-connections>
<!-- 最少保持的空闲链接擿-->
<prototype-count>3</prototype-count>
<!-- 容许最大链接数,超过了这个链接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-

connections决定 -->
<maximum-connection-count>20</maximum-connection-count>
<!-- 最小链接数 -->
<minimum-connection-count>3</minimum-connection-count>
<!-- 在分配链接先后是否进行有效性测试,这个是解决本问题的关钿-->
<test-before-use>true</test-before-use>
<test-after-use>true</test-after-use>
<!-- 用于测试的SQL语句 --> <house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql> </proxool> </something-else-entirely>
相关文章
相关标签/搜索