
为什么设置 pool_recycle 能解决 “Lost connection to MySQL server”
MySQL 默认关闭闲置超过 wait_timeout(通常 8 小时,但生产环境可能被调低至 120–900 秒)的连接;而 Flask-SQLAlchemy 的连接池默认不主动验证连接有效性,拿到一个“看似可用”实则已被 MySQL 单方面断开的连接后,首次查询就会抛出 pymysql.err.OperationalError: (2013, ‘Lost connection to MySQL server during query’)。设置 pool_recycle 是让连接池在指定秒数后强制丢弃旧连接、新建连接,从而避开失效窗口。
新旧版本中怎么配置 pool_recycle
Flask-SQLAlchemy 从 3.x 版本起已废弃 SQLALCHEMY_POOL_RECYCLE 配置项,直接设它无效;必须改用 SQLALCHEMY_ENGINE_OPTIONS 传入 pool_recycle 参数:
旧版(app.config[“SQLALCHEMY_POOL_RECYCLE”] = 120新版(≥3.0,推荐)必须写:app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {"pool_recycle": 120}值必须严格小于 MySQL 的 wait_timeout(建议留至少 30 秒余量),否则仍会踩中超时点
如何查清你当前 MySQL 的 wait_timeout 值
别猜,直接连进数据库执行:
SHOW VARIABLES LIKE ‘wait_timeout’;
注意:这个值是秒数,不是分钟。常见错误包括:
立即学习“Python免费学习笔记(深入)”;
误以为是 8 小时(28800),结果云数据库(如阿里云 RDS、腾讯云 CDB)常设为 300 或 600只查了 interactive_timeout,但它对应用连接无效(Flask 使用的是非交互式连接)修改了配置但没重启 MySQL 实例(云数据库需在控制台操作或提交工单)
pool_recycle 设太小或太大分别有什么后果
这不是越小越安全、越大越省资源的简单选择:
设太小(如 30):每 30 秒就重建连接,频繁握手 + 认证开销,QPS 高时可能触发 max_connections 限制或拖慢响应设太大(≥ wait_timeout):等于没设,问题照旧;设为 -1(永不回收)在 MySQL 环境下等同于自毁合理值范围:比 wait_timeout 小 30–60 秒,例如 MySQL 返回 wait_timeout=900,就设 pool_recycle=840
真正容易被忽略的是:这个参数只影响“空闲连接”,正在执行查询的连接不会被中途回收;但如果你有长耗时任务(如 Celery 中跑几小时的 job),记得手动调用 db.session.close(),否则 session 持有的连接会卡在池里直到超时。

评论(0)