【问题标题】:QueuePool limit reached for Flask applicationFlask 应用程序达到 QueuePool 限制
【发布时间】:2018-12-07 18:38:39
【问题描述】:

我正在使用 Flask 和 Flask-SQLAlchemy 运行应用程序。

from config import FlaskDatabaseConfig
from flask import Flask
from flask import request
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

application = Flask(__name__)
application.config.from_object(FlaskDatabaseConfig())
db = SQLAlchemy(application)

@application.route("/queue/request", methods=["POST"])
    def handle_queued_request():
        stuff()
        return ""

def stuff():
    # Includes database queries and updates and a call to db.session.commit()
    # db.session.begin() and db.session.close() are not called
    pass

if __name__ == "__main__":
    application.run(debug=False, port=5001)

现在,据我了解,通过使用 Flask-SQLAlchemy,我不需要自己管理会话。那么,如果我轮流向端点运行多个请求,为什么会出现以下错误?

sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/3o7r)

我尝试过使用db.session.close(),但后来我的数据库更新没有正确提交,而不是这个错误。我做错了什么?处理请求后是否需要手动关闭与数据库的连接?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我已经找到了解决方案。问题是我有很多“在事务中空闲”的进程,因为在使用 Query.first() 进行某些数据库 SELECT 语句后我没有调用 db.session.commit()

    为了调查这个问题,我直接使用以下方法查询了我的(开发)PostgreSQL 数据库:

    SELECT * FROM pg_stat_activity
    

    【讨论】:

    • 为什么选择查询后需要提交?我有同样的问题,但不明白为什么会这样。你能详细说明一下吗?
    • 嗨,我认为这个修复并没有解决问题的根源。在 Flask 中创建数据库连接的方式可能存在问题。就个人而言,我认为我有循环导入,它为每个请求创建了两个连接,其中一个没有关闭。另一个潜在问题是我直接使用模型实体进行查询(例如User.query.get 而不是db.session.query(User).get。所以我建议检查您如何创建数据库(例如参见stackoverflow.com/questions/54637324/…)以及使用模型中的查询对象
    【解决方案2】:

    每次对 db 进行查询会话时,只需删除连接即可。

    products = db.session.query(Product).limit(20).all()
    db.session.remove()
    

    【讨论】:

    • 您好,Minh,感谢您的回答。这不是已经由 flask-sqlalchemy 处理了吗?
    • @Konrad 截至 2021 年 4 月 12 日,答案是否定的。这是我刚刚发现的。
    • 嗨,Minh,我现在对 Flask 有了更好的体验,这不是我现在面临的错误。据我所知,这个问题与空闲数据库会话有关。我们目前有一个生产应用程序,我们从来不需要手动调用 db.session.remove()。
    猜你喜欢
    • 2016-11-12
    • 2014-09-17
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2020-04-26
    • 2018-06-02
    相关资源
    最近更新 更多