我有一个使用SQLAlchemy和MySQL的Flask web应用程序,并且我设置了一个作用域set ()。我还有一个teardown_request处理程序,它在每个请求完成后调用session.remove()。出于某种奇怪的原因,如果web应用程序在一天或更长时间内没有请求,应用程序会收到“操作错误: MySQL服务器已消失”。
在我的调试任务中,我查看了SHOW PROCESSLIST,并看到了以下内容:
39817253 | sqladmin | my_host | kb_dev | Sleep | 174 |
174是来自我的应用程序的连接已经“休眠”的秒数。如果应用程序没有发出另一个请求,它会继续计数。
即使在我的请求完成之后,我的应用程序似乎仍然保持着到MySQL的连接!而且,无论我的应用程序发出多少请求,通常只有一个进程,无论是否同时进行。
我的问题是,连接“休眠”这么长时间是否正常?我很确定延长休眠时间会导致MySQL在某个超时后切断连接,而这反过来又会导致"OperationalError: Mysql已消失“错误。
发布于 2012-01-12 02:56:20
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
几天前的博客文章:
https://stackoverflow.com/questions/8824826
复制相似问题