sqlalchemy не может подключиться к БД после простоя сервера в течение нескольких часов - PullRequest
3 голосов
/ 06 июля 2011

У меня довольно стандартная установка, где сервер приложений отделен брандмауэром от сервера базы данных. Приложение, использующее sqlalchemy и базу данных, является postgres.

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

WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed

Я настроил пул соединений с параметром pool_recylce, установленным на 30 минут, чтобы не было соединений, задерживающихся более 30 минут. Проблема сохраняется.

есть идеи?

1 Ответ

5 голосов
/ 06 июля 2011

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

Вам нужно либо:

  • настроить брандмауэр на длительное запоминание подключений & mdash; это может быть невозможно, хотя;
  • настроить keepalive на сервере, например так:
    tcp_keepalives_idle=600
    tcp_keepalives_interval=30
    tcp_keepalives_count=60
    
    Это означает, что если соединение не используется в течение 10 минут, попробуйте отправлять контрольные сообщения каждые 30 секунд до ответа, закройте соединение, если 60 проб игнорируются (соединение разорвано на 30 минут);
  • настроить keepalive в клиенте с помощью `keepalives_idle`,` keepalives_interval` и `keepalives_count` параметры подключения ; Я не знаю, возможно ли это в SQLAlchemy;

Отключить pool_recycle, поскольку ИМХО это работает, только если вы закрываете соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...