Flask-SQLAlchemy TimeoutError

时间:2013-05-19 15:03:18

标签: python sqlalchemy flask flask-sqlalchemy

我的后端配置是:

  • Ubuntu 12.04
  • Python 2.7
  • Flask 0.9
  • 烧瓶SQLAlchemy的
  • Postgres 9.2

我收到此错误消息:

TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30

我是否需要明确关闭db.session?当会话超出范围时,不应该是回到池的连接吗?

5 个答案:

答案 0 :(得分:6)

如果您在应用程序中使用debug=True并且加载了多个错误的页面或API端点,则可能会发生这种情况。

原因是运行应用程序的调试版本会在错误页面中打开实时调试程序。这个实时调试器可以处理处理请求的所有资源,以便您可以检查它们。这意味着无法回收数据库连接。

您不应该将调试模式用于您的应用程序的生产版本(除了这样的问题,这是一个安全风险),并且调试器通常无法正常工作(它旨在与烧瓶测试服务器一起使用) ,而不是枪炮)。因此,在prod中解决方案是关闭调试。

如果您在使用调试模式的开发中遇到此问题 - 这是一个限制。你不应该如此努力地击中开发服务器,或者你可以增加限制。请注意,15个连接通常足以在正确回收大量并发请求时提供服务。它只是在调试中才会耗尽。

答案 1 :(得分:2)

Flask-SQLAlchemy为您管理连接池,因此通常不需要这样做。但是,在某些情况下,它无法控制此情况,特别是如果您在请求上下文之外执行查询或在某处使用with app.app_context()

当我将Flask-SQLAlchemy与apscheduler配对时,我发现自己必须在调度程序执行的作业中显式关闭会话,或者在运行几个小时之后我会收到此错误。

答案 2 :(得分:1)

我还必须添加@app.teardown_request方法:

@app.teardown_request
    def checkin_db(exc):
        user_store.db_session.remove()

我遵循了“官方” FlaskSecurity Basic SQLAlchemy Application with session quick start,在几个请求之后,得到了“ sqlalchemy.exc.TimeoutError:大小为5的QueuePool溢出10,连接超时,超时30错误”。添加以上代码似乎已解决了该问题:

  • FlaskSecurity:版本3.0.0
  • 烧瓶:版本1.0.2

答案 3 :(得分:0)

@app.teardown_request
def checkin_db(exc):
    try:
        g.db.close()
    except AttributeError:
        pass

答案 4 :(得分:0)

旧的,但对于仍然有此问题的任何人,我只需重新启动 Flask 开发服务器即可修复它。希望这有帮助!