Достигнуто ограничение QueuePool для приложения Flask - PullRequest
0 голосов
/ 28 июня 2018

Я запускаю приложение с 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(), но тогда вместо этой ошибки мои обновления базы данных не фиксируются должным образом. Что я делаю неправильно? Нужно ли вручную закрывать соединения с базой данных после обработки запроса?

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Просто удаляйте соединение каждый раз, когда вы выполняете сеанс запроса к БД.

products = db.session.query(Product).limit(20).all()
db.session.remove()
0 голосов
/ 28 июня 2018

Я нашел решение для этого. Проблема заключалась в том, что у меня было много процессов, которые были «бездействующими в транзакции», потому что я не вызывал db.session.commit() после выполнения определенных операторов SELECT для базы данных, используя Query.first()

Чтобы исследовать это, я запросил мою (разрабатываемую) базу данных PostgreSQL напрямую, используя:

SELECT * FROM pg_stat_activity
...