Как правильно закрыть соединения mysql в sqlalchemy?
Я хотел бы знать, что такое правильный способ закрыть все соединения mysql в sqlalchemy
.
Для контекста это приложение колбы, и все представления разделяют одно и то же session
"объект".
engine = create_engine("mysql+pymysql://root:root@127.0.0.1/my_database")
make_session = sessionmaker(bind=engine, autocommit=False)
session = ScopedSession(make_session)()
и когда приложение сорвано,session
закрыт и engine
расположена
session.close()
engine.dispose()
но согласно журналу базы данных, у меня все еще есть много ошибок, таких как [Warning] Aborted connection 940 to db: 'master' user: 'root' host: '172.19.0.7' (Got an error reading communication packets)
.
Я пробовал некоторые решения, включая вызов gc.collect()
и engine.pool.dispose()
но без успеха ...
Я подозреваю, что все еще есть некоторые соединения, открытые двигателем за сценой, и их нужно закрыть. Есть ли в любом случае список всех сеансов/соединений, открытых двигателем?
потратив много времени на это, любые советы/помощь/указатель будут высоко оценены! Спасибо.
P. S: так dispose
и close
звонки вдохновлены от как закрыть соединение sqlalchemy в MySQL. Кстати, что такое "проверенное" соединение?
2 ответов
Это может не ответить на ваш вопрос полностью, но я использую этот метод, чтобы убедиться, что все мои сеансы закрыты. Каждая функция, использующая сеанс, получает декоратор provide_session. Примечание
наконец я нашел виновника:apscheduler, который запускается в фоновом режиме использует session
подключен к базе данных и, похоже, не освобождает ее должным образом.
также лучшая практика, которую мы нашли для обработки сеансов sqlalchemy в приложении колбы, - использовать scoped_session
и обязательно позвоните remove()
на ней в конце запроса (т. е. appcontext_teardown
). Это также используется в расширение колбы-sqlalchemy.