Странно, что мое соединение 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/