api关闭mysql_sqlalchemy mysql连接未关闭flask api

在Flask应用中,一个API使用SQLAlchemy处理MySQL数据库,但发现即使在调用close()方法后,数据库连接仍然保持打开状态。问题在于,尽管连接对象在API调用结束后超出作用域并可能被垃圾回收,但实际连接在MySQL进程中仍显示为“睡眠”。通过在`commands`函数中实例化和关闭SqlSession对象,期望在HTTP响应完成后立即关闭连接,然而,这并未按预期工作,导致连接长时间保持打开。
摘要由CSDN通过智能技术生成

我有一个在烧瓶里写的api。它使用sqlalchemy来处理mysql数据库。我不使用flask sqlalchemy,因为我不喜欢模块强制您进入特定模式来声明模型的方式。

我的数据库连接无法关闭。表示连接的对象超出了范围,因此我假设它是垃圾回收的。我还在会话中显式调用close()。尽管存在这些事实,但是在api调用返回其响应之后,连接会保持打开状态很长时间。

这是我在会话中使用的包装器。class SqlSession:

def __init__(self, conn=Constants.Sql):

self.db = SqlSession.createEngine(conn)

Session = sessionmaker(bind=self.db)

self.session = Session()

@staticmethod

def createEngine(conn):

return create_engine(conn.URI.format(user=conn.USER, password=conn.PASS, host=conn.HOST, port=conn.PORT, database=conn.DATABASE, poolclass=NullPool))

def close(self):

self.session.close()

flaskroutes.py:下面是flask应用程序实例化和使用包装器对象的示例。注意,它首先在api调用的范围内实例化它,然后在结束时关闭会话,并且可能在返回响应后被垃圾回收。def commands(self, deviceId):

sqlSession = SqlSession(self.sessionType)

commandsQueued = getCommands()

jsonCommands = []

for command in commandsQueued:

jsonCommand = command.returnJsonObject()

jsonCommands.append(jsonCommand)

sqlSession.session.delete(command)

sqlSession.session.commit()

resp = jsonify({'commands': jsonCommands})

sqlSession.close()

resp.status_code = 200

return resp

我希望在http响应完成后立即清除连接,但连接最终会处于“睡眠”状态(在mysql命令行界面“show processlist”中查看时)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值