解决flask-sqlalchemy的mysql has gone away

在使用Flask-sqlalchemy基于Mysql 5.7 进行部署运行一段时间后,程序出现mysql has gone away错误。

一番查询,找到解决方法:

链接: https://stackoverflow.com/questions/6471549/avoiding-mysql-server-has-gone-away-on-infrequently-used-python-flask-server

出现原因

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

成功解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值