一 问题说明:更新了一下数据库发现过一段时间访问页面会返回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%";
这里是说8小时wait_timeout为8小时。
2,在flask的config.py文件中加入SQLALCHEMY_POOL_RECYCLE=400。