我的 SQLAlchemy MySQL 连接总是以休眠结束,这很奇怪吗?

Posted

技术标签:

【中文标题】我的 SQLAlchemy MySQL 连接总是以休眠结束,这很奇怪吗?【英文标题】:Is it odd that my SQLAlchemy MySQL connection always ends up sleeping? 【发布时间】:2012-02-08 03:17:00 【问题描述】:

我有一个使用 SQLAlchemy 和 mysql 的 Flask Web 应用程序,并且我已经设置了一个 scopedsession()。我还有一个 teardown_request 处理程序,在每个请求完成后调用 session.remove() 。出于某种奇怪的原因,如果一天或更长时间没有在 Web 应用上发出任何请求,应用会收到“操作错误:MySQL 服务器已消失”。

在我的调试任务中,我查看了 SHOW PROCESSLIST 并看到以下内容:

39817253 | sqladmin | my_host | kb_dev   | Sleep   |  174 |

174 是来自我的应用程序的连接“休眠”的秒数。如果应用程序没有发出另一个请求,它会继续计数。

即使在我的请求完成后,我的应用程序似乎仍保持与 MySQL 的连接!无论我对我的应用程序同时提出多少请求,通常只有一个进程。

我的问题是连接“休眠”这么长时间是否正常?我很确定延长睡眠会导致 MySQL 在某个超时后切断连接,这反过来又会导致“OperationalError:Mysql has gone away”错误。

【问题讨论】:

问题解决了吗?设置 pool_recycle 对我不起作用。 【参考方案1】:

SQLAlchemy 的默认行为是在引擎中汇集连接:

http://www.sqlalchemy.org/docs/core/engines.html

http://www.sqlalchemy.org/docs/core/pooling.html

至于断开连接的事情,这是一个已知的 MySQL 行为,SQLAlchemy 提供了 pool_recycle 标志来解决它。这里有许多描述它的链接:

http://www.sqlalchemy.org/docs/dialects/mysql.html#connection-timeouts

http://www.sqlalchemy.org/docs/core/pooling.html#setting-pool-recycle

http://www.sqlalchemy.org/docs/core/engines.html#sqlalchemy.create_engine (pool_recycle)

http://www.sqlalchemy.org/trac/wiki/FAQ#MySQLserverhasgoneaway

几天前的博文:

http://douglatornell.ca/blog/2012/01/08/staying-alive/

【讨论】:

感谢 zzzeek,现在一切都说得通了。我不知道默认情况下启用了连接池。但看起来我现在要尝试 pool_recycle 选项。 @trinth 你能解决你的问题吗?我也面临同样的情况。 @giga 已经有一段时间了,但我相信 pool_recycle 选项为我修复了它 pool_recycle 或 pool_size 不适用于我的情况:self.engine = sqlalchemy.create_engine(url, pool_size=2, pool_recycle=1200)。 1200 秒后,这些连接仍在“进程列表”中。

以上是关于我的 SQLAlchemy MySQL 连接总是以休眠结束,这很奇怪吗?的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SQLAlchemy 和 Gevent 没有关闭 mysql 连接

使用 SQLAlchemy 和 pymysql,如何设置连接以使用 utf8mb4?

Flask,SQLAlchemy和多线程:MySQL连接太多

SqlAlchemy 的 MySQL (mariaDB) 连接错误

从输入创建 SQLAlchemy mysql 连接字符串

需要帮助将带有自连接的 MySQL 查询转换为 SQLAlchemy