flask自动重连数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyongqing/article/details/82655350

情况描述

flask部署到服务器后,日志中经常出现错误

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) 
(2006, "MySQL server has gone away (ConnectionResetError(104, 'Connection reset by peer'))")

看下mysql日志,大量的超时导致的连接中断

...
2018-09-10  6:45:41 768 [Warning] Aborted connection 768 to db: 'xxx' user: 'xxx' host: '172.22.0.2' 
(Got timeout reading communication packets)

问题原因

原因就是因为连接超时,数据库把它中断了,详细参见官方文档.
https://dev.mysql.com/doc/refman/8.0/en/communication-errors.html

起因

  • 查看数据库配置。不要混淆全局配置与会话配置
show global variables like '%timeout%'

connect_timeout      5
interactive_timeout  28800
wait_timeout         600
  • 配置文件my.cnf
connect_timeout         = 5
wait_timeout            = 600

错误复现

mysql错误日志两次中断间隔时间都大于600秒,有可能是该参数引起,将它设置小点看看,能否复现问题

set global wait_timeout=10

设置后,问题又出现了,可以缺点就是该参数引起的。

自动重连实现

无论wait_timeou设置多大,总会出现超时,该怎么避免呢?简单方法是定时重连接.

flask已经提供了重连参数。连接超过一定时间就将它回收。

SQLALCHEMY_POOL_RECYCLE=7200   
# 默认2小时。该值一定要比数据库wait_timeout小,否则它不起作用,上面就是这个原因导致的

当然这个方法不会帮我们处理网络异常导致的连接失效重连

《了凡四训》详解之改过之法
https://v.youku.com/v_show/id_XMzY5NTcxMDIwOA
印光大师十念法(胡小林主讲第1集)
http://v.youku.com/v_show/id_XMzUwMzc4NzY4NA
此生必看的科学实验-水知道答案
http://v.youku.com/v_show/id_XMjgzMzcwNDk4OA

猜你喜欢

转载自blog.csdn.net/wyongqing/article/details/82655350