api关闭mysql_python-Flask API上的sqlalchemy mysql连接未关闭

我有用烧瓶写的api.它使用sqlalchemy来处理mysql数据库.我不使用flask-sqlalchemy,因为我不喜欢该模块强制您进入某种模式来声明模型的方式.

我有一个数据库连接没有关闭的问题.表示连接的对象超出范围,因此我假设它正在被垃圾收集.我还明确地在会话上调用close().尽管有这些事实,但在api调用返回响应后很长时间,连接仍保持打开状态.

sqlsession.py:这是我用于会话的包装器.

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响应后即可清除连接,但是连接最终会以“ SLEEP”状态结束(在mysql命令行界面“ show processlist”中查看时).

解决方法:

我强烈建议向有此问题的任何人阅读该帖子.基本上,我向close方法添加了dispose()调用.这样做会导致整个连接被破坏,而关闭只会将连接返回到可用池中(但保持打开状态).

def close(self):

self.session.close()

self.db.dispose()

整个过程让我有些困惑,但是至少现在我对连接池有了更多的了解.

标签:sqlalchemy,flask,database-connection,python,mysql

来源: https://codeday.me/bug/20191120/2045263.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值