簡體   English   中英

sqlalchemy mysql連接沒有關閉燒瓶API

[英]sqlalchemy mysql connections not closing on flask api

我有一個用燒瓶寫的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:這是一個燒瓶app實例化和使用包裝器對象的示例。 請注意,它在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'中查看時)。

我最后使用了這篇SO帖子的建議: 如何在MySQL中關閉sqlalchemy連接

我強烈建議任何有此問題的人閱讀該帖子。 基本上,我添加了一個dispose()調用close方法。 這樣做會導致整個連接被破壞,而關閉只會返回到可用池的連接(但保持打開狀態)。

def close(self):
    self.session.close()
    self.db.dispose()

這整個對我來說有點混亂,但至少現在我對連接池了解得更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM