Странно, что мое соединение SQLALCHEMY MySQL всегда заканчивается тем, что спит?
-
27-10-2019 - |
Вопрос
У меня есть веб -приложение 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 ушел».
Решение
Поведение по умолчанию SQLALCHEMY - это объединение соединений в двигателе:
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-imeouts
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
Пост в блоге всего несколько дней назад: