我的SQLAlchemy MySQL连接为何总是处于睡眠状态?

20 投票
1 回答
22118 浏览
提问于 2025-04-17 10:02

我有一个使用Flask框架的网页应用,数据库用的是MySQL,并且我设置了一个叫做scopedsession()的东西。我还设置了一个请求结束后的处理程序,它会在每次请求完成后调用session.remove()。奇怪的是,如果我的网页应用一天或更长时间没有请求,应用就会出现“Operationalerror: MySQL Server has gone away”的错误。

在我调试的过程中,我查看了SHOW PROCESSLIST,发现了以下内容:

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

这里的174是指我的应用和MySQL之间的连接已经“休眠”了174秒。如果应用没有发出新的请求,这个数字会一直增加。

看起来我的应用在请求完成后仍然保持着与MySQL的连接!而且无论我同时发出多少请求,通常只有一个进程在运行。

我想问的是,这种连接“休眠”这么久正常吗?我觉得这种长时间的休眠可能导致MySQL在超时后切断连接,从而引发“OperationalError: Mysql has gone away”的错误。

1 个回答

30

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/

撰写回答