1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法

mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法

时间:2021-08-21 22:47:58

相关推荐

mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法

应用程序和数据库建立连接,如果超过8小时应用程序不去访问数据库,数据库就断掉连接。这时再次访问就会抛出异常,如下所示:

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小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常。

关于mysql自动断开的问题研究结果如下,在mysql中有相关参数设定,当数据库连接空闲一定时间后,服务器就会断开等待超时的连接:

1、相关参数,红色部分

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。我建议是将这两个参数都修改,以免引起不必要的麻烦。

2、修改参数

这两个参数的默认值是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/f,在属性组mysqld下面添加参数如下:

[mysqld]

interactive_timeout=28800000

wait_timeout=28800000

如果一段时间内没有数据库访问则mysql自身将切断连接,之后访问java访问连接池时对数据库的数据通道早就关闭了,因为dbcp连接池无法时时维护与数据库的连接关系,mysql5以后即使在dbcp配置中加入autoReconnect=true也没有效果。

其实愚蠢的版本就是直接加大这两个值

正确的解决方法是使用开源的proxool来取代tomcat的dbcp连接池

2、解压缩proxool-0.9.0RC3.zip,拷贝lib下的所有jar库文件到你的工程下的WEB-INF/lib下,同时记得也把Mysql的jdbc驱动到web-info/lib

3、在WEB-INF下(别跑错地方)建立文件:proxool.xml

proxool.xml这个文件是用来设置别名的。

其中标签就是别名的设置段。

alias是别名;

driver-url是驱动的url,就是连接的url;

driver-class是驱动的类,就是数据库驱动;

driver-properties是驱动的属性,可以设置登陆数据库的用户名和密码。maximum-connection-count是最大连接数;

house-keeping-sleep-time是proxool自动侦察各个连接状态的时间间隔(毫秒)属性,侦察到空闲的连接就马上回收,超时的销毁;

house-keeping-test-sql是proxool自动侦察各个连接状态是用的sql。

文件内容如下:

crm

jdbc:mysql://127.0.0.1:3306/crm?useUnicode=true&autoReconnect=true&characterEncoding=GBK

com.mysql.jdbc.Driver

25

5

60000

select 1

4、在WEB-INF/web.xml中节点里加入如下内容:

proxoolServletConfigurator

org.logicalcobwebs.proxool.configuration.ServletConfigurator

xmlFile

WEB-INF/proxool.xml

1

Admin

org.logicalcobwebs.proxool.admin.servlet.AdminServlet

Admin

/admin

5、在需要连接数据库时,只需要写:

Connection conn = DriverManager.getConnection("proxool.DBPool");

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。