在使用Flask-sqlalchemy基于Mysql 5.7 进行部署运行一段时间后,程序出现mysql has gone away
错误。
一番查询,找到解决方法:
出现原因
Mysql的wait_timeout
默认时间是8小时,即28800秒。
flask-sqlalchemy使用sqlalchemy,默认的连接池回收时间为-1
,即默认不回收
这就导致了长时间连接Mysql数据库,从而Mysql主动断开后,连接失效缺没有更新的
解决办法
一开始尝试了以下参数
SQLALCHEMY_POOL_RECYCLE = 50 # 解决mysql connect gone away
SQLALCHEMY_POOL_SIZE = 20
SQLALCHEMY_POOL_PRE_PING = True
即 SQLALCHEMY_POOL_RECYCLE * SQLALCHEMY_POOL_SIZE < 28800, 让连接重新生成时间小于mysql的超时时间
但是没有起作用,看到有人说:
后面更改为以下写法:
SQLALCHEMY_ENGINE_OPTIONS = {'pool_size': 20, 'pool_recycle': 50, 'pool_pre_ping': True}
解决了该问题,目前暂时还未再次出现gone away
后续: 仍然会出现那个问题。
再次寻找解决办法
SQLALCHEMY_POOL_PRE_PING = True
SQLACHEMY_ENGINE_OPTIONS = {'pool_recycle': 280, 'pool_pre_ping': True}
更新:2021-01-05, 该问题仍然会出现
更新:2021-01-09:
修改配置
SQLALCHEMY_ENGINE_OPTIONS = {'pool_recycle': 15, 'pool_size': 20}
增加请求后处理, 移除本次请求的session
@app.after_request
def close_request_session(response):
# 解决mysql server gone away
db.session.remove()
return response
成功解决