flask-sqlalchemy出现(2006, "MySQL server has gone away

一 问题说明:更新了一下数据库发现过一段时间访问页面会返回500,然后刷新一两次就又可以访问了,查看后台日志文件,发现报错。

...
    self._sock.sendall(data)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:
...
    "MySQL server has gone away (%r)" % (e,))
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) 
(2006, "MySQL server has gone away (ConnectionResetError(104, 
'Connection reset by peer'))")
...

二 问题原因:
这个问题一般是mysql断开连接了。
1,mysql有wait_timeout全局变量,这个定义了如果不操作数据库wait_timeout=n秒后mysql就会断开数据库。
2,无论wait_timeout设置的有多大,总会有超时的一天,这时候需要flask-sqlalchemy自带的全局变量SQLALCHEMY_POOL_RECYCLE,这个变量是说超过SQLALCHEMY_POOL_RECYCLE=n秒后,flask会回收连接,重新创建连接,只要设置n<wait_timeout就可以了。

wait_timeout和interactive_timeout区别:二者都是设置超过一定的时间就断开数据库的参数,
不同的是,interactive_timeout为交互式,比方说Navicate premium这样有图形用户界面就是交互式,wait_timeout为非交互式比如jdbc,pymysql或orm这种。

三 解决过程:1,登陆数据库,查询全局变量:
show variables like "%timeout%";

image.png

这里是说8小时wait_timeout为8小时。
2,在flask的config.py文件中加入SQLALCHEMY_POOL_RECYCLE=400。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容