<返回更多

mysql服务器在无操作超时主动断开连接的问题

2019-08-26    
加入收藏

解决mysql服务器在无操作超时主动断开连接的问题

 

我们在使用MySQL服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询的时候就会报个"MySQL server has gone away"的误,但是有时候,由于mysql服务器那边做了一些设置,很多情况下会缩短这个连接timeout时长以保证更多的连接可用。有时候设置得比较变态,很短,30秒,这样就需要客户端这边做一些操作来保证不要让mysql主动来断开。

查看mysql的timeout

使用客户端工具或者Mysql命令行工具输入show global variables like '%timeout%';就会显示与timeout相关的属性,这里我用Docker模拟了一个测试环境。

解决mysql服务器在无操作超时主动断开连接的问题

 

wait_timeout:服务器关闭非交互连接之前等待活动的秒数,就是你在你的项目中进行程序调用

interactive_timeout: 服务器关闭交互式连接前等待活动的秒数,就是你在你的本机上打开mysql的客户端,比如cmd

使用pymysql进行查询

我在数据库里随便创建了一个表,插入两条数据

解决mysql服务器在无操作超时主动断开连接的问题

 

我使用pymysql这个库对其进行查询操作,很简单

解决mysql服务器在无操作超时主动断开连接的问题

 

可以正确的得到结果

(1, 'yang', 18)
(2, 'fan', 16)

连接超时以后的查询

上面可以正常得到结果是由于当创建好一个连接以后,就立刻进行了查询,此时还没有超过它的超时时间,如果我sleep一段时间,看看什么效果。

解决mysql服务器在无操作超时主动断开连接的问题

 

这里进行了两次查询,因为我把mysql的wait_timeout设置了30秒,所以我在第一次查询之后停了31秒,目的让mysql服务主动的和我刚才创建的连接断开,得到的结果是

解决mysql服务器在无操作超时主动断开连接的问题

 

可以看到在停了31秒钟以后,再次使用该连接进行查询将抛出2013, 'Lost connection to MySQL server during query'错误。

解决办法

解决的方法有两种,既然这里的超时是由于在规定时间内没有任何操作导致mysql主动的将连接关闭,pymysql的connection对象有一个ping()方法,可以检查连接是否有效,在每次执行查询操作之前先执行一下ping()方法,该方法默认的有个reconnect参数,默认是True,如果失去连接了会重连。

解决mysql服务器在无操作超时主动断开连接的问题

 

我曾尝试使用另外一个线程不停来执行ping()操作,但是当我这样做以后连接就会丢失,之后的操作就不能进行了。这个问题我再研究研究。

解决mysql服务器在无操作超时主动断开连接的问题

 

还有一种方法是使用连接池,连接池中保持着指定数量的可用连接,每次重新获取一个有效的连接进行查询操作,pymysql本身不具有连接池功能,需要借住DBUtils

解决mysql服务器在无操作超时主动断开连接的问题

 

这种方式虽然可以正确的获取结果,但是实际的项目中并不会这么使用,而是在执行完查询语句以后要将connection关闭,注意这里的关闭并不是真正的关闭,而只是将连接返回给连接池让其他人使用.

解决mysql服务器在无操作超时主动断开连接的问题
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>