我有一个使用SQLAlchemy和MySQL的Flask web应用程序,并且我已经设置了scopedsession()。我还有一个teardown_请求处理程序,它在每个请求完成后调用session.remove()。出于某种奇怪的原因,如果一天或更长时间没有在web应用上发出请求,则该应用将得到“Operationalerror:MySQL Server has gone away”。
在我的调试任务中,我查看了SHOW PROCESSLIST,看到了以下内容:
39817253 | sqladmin | my_host | kb_dev | Sleep | 174 |
174是我的应用程序连接“休眠”的秒数。如果应用程序不提出另一个请求,它将继续计数。
即使在我的请求完成之后,我的应用程序似乎仍然保持与MySQL的连接!而且通常只有一个进程,无论我对我的应用程序提出多少请求,同时或不。
我的问题是,连接“睡眠”这么长时间是否正常?我敢肯定,扩展睡眠导致MySQL在某个超时之后切断连接,而这又导致了“OperationalError:MySQL has gone away”错误。
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(池回收)
http://www.sqlalchemy.org/trac/wiki/FAQ#MySQLserverhasgoneaway
几天前的博客文章:
http://douglatornell.ca/blog/2012/01/08/staying-alive/
相关问题 更多 >
编程相关推荐