Как правильно закрыть соединения 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.