Я недавно видел MySQL server has gone away
в журналах приложений для демона, который у меня работает с использованием SQLAlchemy.Соединения не закрыты SQLAlchemy
Я завершаю каждый запрос или обновление базы данных в декораторе, который должен закрыть все сеансы после завершения. Теоретически это также должно закрыть connection
.
Мой декоратора выглядит
def dbop(meth):
@wraps(meth)
def nf(self, *args, **kwargs):
self.session = self.sm()
res = meth(self, *args, **kwargs)
self.session.commit()
self.session.close()
return res
return nf
Я также инициализировать базу данных в верхней части моего сценария Python с:
def initdb(self):
engine = create_engine(db_url)
Base.metadata.create_all(engine)
self.sm = sessionmaker(bind=engine,
autocommit=False,
autoflush=False,
expire_on_commit=False)
моему пониманию, я получаю эту ошибку, потому что мое подключение синхронизации вне. Почему это будет так, если я завершу каждый метод в этом декораторе выше? Это потому, что expire_on_commit
вызывает запросы даже после закрытия соединения и может их снова открыть? Это потому, что Base.metadata.create_all
вызывает выполнение SQL, который открывает соединение, которое не закрыто?
'Session.close()' закрывает * session *, а не соединение. Там ['Session.invalidate()'] (http://docs.sqlalchemy.org/en/improve_toc/orm/session_api.html#sqlalchemy.orm.session.Session.invalidate), который также аннулирует связанное соединение, но я Представьте, что это происходит с довольно штрафным санкцией, я бы этого не сделал.Я предлагаю вам взглянуть на [Работа с разъединениями] (http://docs.sqlalchemy.org/en/latest/core/pooling.html#dealing-with-disconnects) и выбрать либо оптимистичную, либо пессимистическую стратегию, а также установить ' pool_recycle' для вашего движка. –
Действительно @LukasGraf. Обычно вы не закрываете соединение, а сохраняете пул соединений. Даже если вы ничего не делаете, 'SQLAlchemy' определяет пул с конфигурацией по умолчанию (см. Выше на той же странице, что и ссылка) – lrnzcig