У меня были проблемы с этим раньше, и я обнаружил, что способ справиться с этим - не проводить сессии.Проблема в том, что вы пытаетесь держать соединение открытым слишком долго.Вместо этого используйте сеанс локальной области потока, например, в __init__.py
или в пакете утилит, который вы импортируете повсюду:
from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session( sessionmaker() )
Затем настройте ваши движки и метаданные один раз.Это позволяет пропускать механику конфигурации при каждом подключении / отключении.После этого вы можете выполнить свою работу с БД следующим образом:
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
Если вы хотите сохранить старые объекты и не хотите оставлять сеанс открытым, то вы можете использовать приведенный выше шаблон иповторно используйте старые объекты, например:
session = Session()
someObject = session.merge( someObject )
# more db stuff
session.close()
Дело в том, что вы хотите открыть сеанс, выполнить свою работу, а затем закрыть сеанс.Это очень хорошо позволяет избежать тайм-аутов.Существует множество опций для .merge и .add, которые позволяют вам включать изменения, сделанные вами в отдельные объекты, или загружать новые данные из БД.Документы очень многословны, но как только вы поймете, что ищете, вам будет немного легче найти.
Чтобы действительно пройти весь путь и предотвратить «уход» MySQL, вам нужнорешите проблему вашего пула соединений, сохраняя соединения открытыми слишком долго и проверяя старое соединение для вас.
Чтобы установить новое соединение, вы можете установить опцию pool_recycle
в своем вызове create_engine
.Задайте в этом параметре pool_recycle
количество секунд времени в пуле соединений между извлечениями, которые вы хотите создать вместо нового существующего соединения.