我在使用 MySQL 数据库的 Python sqlalchemy 库中遇到了一个问题。有很多连接由于某种原因没有被正确处理。我有一个在 Linux docker 容器上作为守护进程运行的服务。我在服务中只有一个调用数据库的函数,所以我确切地知道问题发生在哪里。根据我能找到的所有文档,我不知道为什么会发生这种情况。我的代码的简化版本结构如下:
import sqlalchemy as db
from myapp import config
def run():
engine = db.create_engine(config.CON_STR)
Session = db.orm.sessionmaker(bind=engine)
with engine.connect() as con:
ses = Session(bind=con)
# do work
ses.commit()
return 0
如您所见,引擎和会话在此函数中是隔离的,该函数被调用并很快退出。我可以在我的日志中看到该函数的行为符合预期(意味着它正确进入和退出)。但出于某种原因,有很多挂起的连接(见下文)。
如您所见,这些连接已经挂了很长时间了。
据我所知,引擎和会话变量应该在函数返回时关闭。我一生都无法弄清楚在此函数返回后会发生什么导致连接无法关闭。什么可能导致这个问题?我可以添加一些东西来确保连接正确关闭吗?