Странно, что мое соединение SQLAlchemy MySQL всегда заканчивается спать?
У меня есть веб-приложение Flask с использованием SQLAlchemy с MySQL, и я создал scopedsession(). У меня также есть обработчик teardown_request, который вызывает session.remove() после завершения каждого запроса. По какой-то нечетной причине, если в веб-приложении не поступают запросы в течение дня или более, приложение получает "Operationalerror: MySQL Server ушел".
В моей миссии отладки я посмотрел SHOW PROCESSLIST и увидел следующее:
39817253 | sqladmin | my_host | kb_dev | Sleep | 174 |
174 - это количество секунд, в течение которых соединение из моего приложения было "спящим". Он продолжает подсчитывать, если приложение не делает другого запроса.
Похоже, мое приложение поддерживает соединение с MySQL даже после завершения моего запроса! И обычно есть только один процесс независимо от того, сколько запросов я делаю с моим приложением одновременно или нет.
Мой вопрос в том, нормально ли это соединение "долго спать"? Я уверен, что расширенный сон заставляет MySQL отключать соединение после определенного таймаута, что, в свою очередь, вызывает ошибку "OperationalError: Mysql ушла".
Ответы
Ответ 1
Поведение SQLAlchemy по умолчанию - объединение соединений в Engine:
http://www.sqlalchemy.org/docs/core/engines.html
http://www.sqlalchemy.org/docs/core/pooling.html
Что касается отключенной ночной вещи, это известное поведение MySQL, SQLAlchemy предоставляет флаг pool_recycle, чтобы обойти его. Вот несколько ссылок, которые описывают это:
http://www.sqlalchemy.org/docs/dialects/mysql.html#connection-timeouts
http://www.sqlalchemy.org/docs/core/pooling.html#setting-pool-recycle
http://www.sqlalchemy.org/docs/core/engines.html#sqlalchemy.create_engine (pool_recycle)
http://www.sqlalchemy.org/trac/wiki/FAQ#MySQLserverhasgoneaway
Сообщение в блоге всего несколько дней назад:
http://douglatornell.ca/blog/2012/01/08/staying-alive/