2024年1月25日发(作者:)
当应用程序和数据库建立连接时,如果超过了8个小时,应用程序不去访问数据库,数据库就会出现断掉连接的现象 。这时再次访问就会抛出异常.
一般的解决方法大多是在数据库连接字符串中增加“autoReconnect=true ”选项。但是这只对mysql4以前的版本有效。在最新的mysql中是无效的。
其实要解决这个问题也有一个简单的方法,就是修改mysql的启动参数。缺省情况下mysql的timeout时间是28800秒,正好是8小时,增加一个0就可以了。
决定从根源入手,设置mysql的wait_timeout为31536000(一年),再来试试。
set-variable=wait_timeout=31536000
set-variable=interactive_timeout=31536000
问题得到了解决 想了深入解一下mysql的工作原理
百度了一下Google发现很多人都出现过这种问题,大多是配置hibernate时候出的问题,
可惜我的项目中没有使用到hibernate只是简单的自己配了一个连接池,
所以综合了问题的关键所在改了一下数据库配置,在这里暂且记录一下,以后备用。
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。
这就是问题的所在。
最近碰到了这个问题,检查后发现数据库连接池中保存的连接超时后失效了,下面是官方的解释
mysql gone-away
从Mysql 5.x的某个版本之后,MySQL的自动关闭空闲连接的特性被修改了,假如一个连接空闲到超时时间(默认28000秒8小时),再次发起的Reconnect重新连接请求不会被接受,需要重新建立新连接,这就导致了SER的重连机制不能正常工作:SER只会在需要操作数据库时去使用同一个连接接口,断开了则发起重新连接请求,而且这个问题短期内SER也不能够解决。
下文中将具体讲述处理的方法:
1.使用Mysql 4.0或4.1版本,如果没有用到Mysql 5的一些新特性比如存储过程触发器之类。
2.定时重启Mysql服务器或Ser(由于本问题可能同样会影响到其它一些需要Mysql支持的服务器程序,所以重启Mysql服务器为好,但需要检测Mysql服务器不被使用的一个时间重启比较难确定)
3.设置,有mysqld字段内增加参数:
[mysqld]port = 3306socket = /tmp/it_timeout= 500000interactive_timeout = 500000(500000秒约五六天的超时时间,可根据实际需要选择一个数据库可能空闲的最长时间稍大的时间值。)重启Mysqld应用即可,也可以在执行mysqld时加-o wait_timeout=500000参数同样效果。
在MySQL客户端show variable时应该可以看到最后一条从默认的wait_time=28000变成500000了。
(假如重启Mysqld不生效,可以重启机子)
本文发布于:2024-01-25 22:28:58,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1706192938388.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |