热门标签:
Q:

flask-SQLAlchemy TimeoutError

我的后端配置是 :

  • Ubuntu12.04
  • Python2.7
  • flask0.9
  • flask-SQLAlchemy
  • 赛后9.2

我收到这个错误信息:

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

我是否需要显式关闭数据库。会议? 当会话超出范围时,不应该是连接回到池?

原网址
A:

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

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

你不应该为你的应用程序的生产版本使用调试模式(除了这样的问题之外,这是一个安全风险),而且调试器通常不会工作(它被设计为与flask测试服务器一起工作,而不是与gunicorn一起工作)。 因此,在prod中,解决方案是关闭调试。

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

所有回答

共 4 条

author avatar

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

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

author avatar

我不得不添加@app.teardown_request方法,以及:

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

我跟随"官方"FlaskSecurity基本SQLAlchemy应用程序与会话快速启动和一对夫妇的请求后得到了"sqlalchemy。exc。TimeoutError:大小为5的QueuePool限制溢出10达到,连接超时,超时30错误"。 添加上面的代码似乎已经解决了这个问题:

  • FlaskSecurity:版本3.0.0
  • flask:版本1.0.2
author avatar
@app.teardown_request
def checkin_db(exc):
    try:
        g.db.close()
    except AttributeError:
        pass
author avatar

旧的af,但对于任何仍然有这个问题的人,我能够通过重新启动Flask开发服务器来修复它。 希望这有所帮助!

相似问题