2013-05-19 5 views
4

Моя конфигурация Бэкэнд:Колба-SQLAlchemy TimeoutError

  • 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 

Должен ли я явно закрыть db.session? Не должно быть соединение обратно в пул, когда сеанс выходит за рамки?

ответ

0
@app.teardown_request 
def checkin_db(exc): 
    try: 
     g.db.close() 
    except AttributeError: 
     pass 
+2

Это способ сделать это для SQLAlchemy по умолчанию, но Flask-SQLAlchemy делает это за вас. Это должно быть ** не обязательно, если вы используете Flask-SQLAlchemy. –

2

Flask-SQLAlchemy управляет пулом соединений для вас, поэтому в общем случае для этого не требуется. Однако есть несколько случаев, когда он не может контролировать это, особенно если вы выполняете запросы вне контекста запроса или где-то используете with app.app_context().

Когда я спарил Flask-SQLAlchemy с apscheduler, я обнаружил, что должен явно закрывать сеансы в заданиях, выполненных планировщиком, или после нескольких часов работы я получил бы эту ошибку.

+1

Примечание: Я знаю, что этот вопрос - два года, но это вопрос, который вы задаете из Google, если вы ищете эту ошибку по запросу Flask-SQLAlchemy, а доступная информация устарела (т. Е. Другой ответ неверен). –

5

Это может произойти, если вы используете debug=True в своем приложении, и вы загрузили несколько страниц или конечных точек API, которые были обнулены.

Причина в том, что запуск отладочной версии приложения позволяет отключить отладочный отжиг на странице с ошибкой. Этот живой отладчик поддерживает все ресурсы от обработки запроса, чтобы вы могли их изучить. Это означает, что соединение с базой данных не может быть переработано.

Вы не должны использовать режим отладки для производственной версии вашего приложения (кроме проблем, подобных этому, это риск для безопасности), и отладчик часто не будет работать (он предназначен для работы с тестом на колбу сервер, а не с пушкой). Поэтому в prod решение состоит в отключении отладки.

Если у вас есть эта проблема в dev с использованием режима отладки - это ограничение. Вы не должны так сильно ударять по серверу dev, либо можете увеличить лимит. Имейте в виду, что 15 соединений, как правило, достаточно для обслуживания большого количества одновременных запросов, когда они правильно перерабатываются. Только в отладке они заканчиваются.

+0

У меня такая же проблема, но изменение debug = False не помогает мне избежать ошибки Timeout. Если я просто перезагружу страницу 15 раз, она рухнет. Я использую Flask-Sqlalchemy в заводской схеме и, похоже, не делаю ничего необычного. Но на данный момент мое приложение может просто разбиться, перезагрузив страницы. – bmjjr

+0

@bmjjr Отправьте свой код в другом вопросе, и я посмотрю на него. – jwg

+0

спасибо, я, наконец, выяснил намного больше о том, что происходит с этой ошибкой, в моем случае, когда я запросил posgresql с помощью SELECT * FROM pg_stat_activity; 'я нашел много соединений с состояниями' freele in transaction', которые были связанные с проверками доступа к роли/способностям, главным образом из моих шаблонов.Я использую флеш-логин и то, что решило проблему, активно кэшировало пользовательский объект флажок-login user_loader. Возможно, есть более простое решение, но это, похоже, хорошо работает и устраняет TimeoutErrors в моем случае: https://stackoverflow.com/a/44612181/1493069 – bmjjr

Смежные вопросы