Flask-SQLAlchemy TimeoutError

Mas*_*ari 4 python sqlalchemy flask flask-sqlalchemy

我的后端配置是:

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

我有这个错误信息:

TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30
Run Code Online (Sandbox Code Playgroud)

我是否需要显式关闭db.session?会话超出范围时,不应该是连接回池吗?

jwg*_*jwg 6

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

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

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

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


小智 0

@app.teardown_request
def checkin_db(exc):
    try:
        g.db.close()
    except AttributeError:
        pass
Run Code Online (Sandbox Code Playgroud)

  • 这是默认 SQLAlchemy 执行此操作的方法,但 Flask-SQLAlchemy 会为您执行此操作。如果您使用 Flask-SQLAlchemy,这应该是不必要的。 (3认同)