解决在 SAE 中使用 Flask-SQLAlchemy 出现 MySQL server has gone away 的问题

这段时间尝试把 进销存SAAS 迁移到 新浪云(SAE),这样的话减少了运维的麻烦而且降低了成本,我现在暂时只用到了一个最基础的容器+一个最低配置的 MySQL 服务,每天的成本只有 2 块多。打算迁移完之后改成两个容器实例。

但是在迁移中发现一个问题,当过一会不访问服务后,再次访问时会出现 MySQL server has gone away 的错误,在 SAE 提供的数据库中用 SHOW VARIABLES; 检查了下,SAE 给数据库配置的 wait_timeout 是 300 秒,我之前阿里云上的数据库没有改配置,所以默认为 8 小时,而且 SAE 数据库 的这个值是不允许修改的,所以既然无法改变环境,就来适应环境吧

尝试了很多解决办法,比如 配置SQLALCHEMY_COMMIT_ON_TEARDOWN=True 和 在每次请求完成后关闭 db 的 session 都没有解决问题,再次阅读文档时看到了这个配置:SQLALCHEMY_POOL_RECYCLE,作用是设置多少秒后回收连接,在使用 MySQL 时是必须设置的。如果不提供值,默认为 2 小时,而我之前的数据库默认 wait_timeout 为 8 小时,所以一直没有出过问题。我在我的配置文件中,将这个值设置为 280 秒(小于 300 秒),最终解决了问题。

最后帖一下SQLALCHEMY_POOL_RECYCLE参数的原文解释:

Number of seconds after which a connection is automatically recycled. This is required for MySQL, which removes connections after 8 hours idle by default. Note that Flask-SQLAlchemy automatically sets this to 2 hours if MySQL is used.