7

我的后端配置是:

  • Ubuntu 12.04
  • 蟒蛇 2.7
  • 烧瓶 0.9
  • Flask-SQLAlchemy
  • Postgres 9.2

我收到此错误消息:

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

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

4

5 回答 5

10

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

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

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

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

于 2016-06-29T11:06:27.773 回答
2

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

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

于 2015-02-18T03:02:00.780 回答
1

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

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

我遵循“官方”FlaskSecurity Basic SQLAlchemy Application 与会话快速启动,并在几个请求后得到“sqlalchemy.exc.TimeoutError:QueuePool limit of size 5 overflow 10达到,连接超时,超时30错误”。添加上面的代码似乎已经解决了这个问题:

  • FlaskSecurity:版本 3.0.0
  • 烧瓶:版本 1.0.2
于 2018-07-29T11:02:55.777 回答
0
@app.teardown_request
def checkin_db(exc):
    try:
        g.db.close()
    except AttributeError:
        pass
于 2013-05-20T14:58:31.453 回答
0

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

于 2021-03-25T15:53:28.710 回答