我的后端配置是:
我收到此错误消息:
TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30
我是否需要明确关闭db.session?当会话超出范围时,不应该是回到池的连接吗?
答案 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错误”。添加以上代码似乎已解决了该问题:
答案 3 :(得分:0)
@app.teardown_request
def checkin_db(exc):
try:
g.db.close()
except AttributeError:
pass
答案 4 :(得分:0)
旧的,但对于仍然有此问题的任何人,我只需重新启动 Flask 开发服务器即可修复它。希望这有帮助!