Flask-SQLAlchemy和Gevent没有关闭mysql连接

jaa*_*apz 7 sqlalchemy gevent uwsgi flask-sqlalchemy

我目前正在使用Flask-uWSGI-Websockets为我的应用程序提供websocket功能.我使用Flask-SQLAlchemy连接到我的MySQL数据库.

Flask-uWSGI-Websockets使用gevent来管理websocket连接.

我目前遇到的问题是,当websocket连接结束时,Flask-SQLAlchemy设置的数据库连接将继续存在.

我试过调用db.session.close()db.engine.dispose()在每个websocket连接之后,但这没有效果.

gevent.monkey.patch_all()在我的应用程序的开头调用并没有什么区别.

我正在做的简单表示是这样的:

from gevent.monkey import patch_all
patch_all()

from flask import Flask
from flask_uwsgi_websocket import GeventWebSocket
from flask_sqlalchemy import SQLAlchemy

app = Flask()
ws = GeventWebSocket()
db = SQLAlchemy()

db.init_app(app)
ws.init_app(app)


@ws.route('/ws')
def websocket(client):
    """ handle messages """
    while client.connected is True:
        msg = client.recv()
        # do some db stuff with the message

    # The following part is executed when the connection is broken,
    # i tried this for removing the connection, but the actual
    # connection will stay open (i can see this on the mysql server).
    db.session.close()
    db.engine.dispose()
Run Code Online (Sandbox Code Playgroud)

van*_*nov 0

我有同样的情况。我的解决方案位于 mysql 配置文件中my.cnf

[mysqld]
interactive_timeout=180
wait_timeout=180
Run Code Online (Sandbox Code Playgroud)

保存my.cnf后必须重新启动mysql服务。

如果你不想重启mysql服务,你可以使用sql查询:

SET GLOBAL interactive_timeout = 180;
SET GLOBAL wait_timeout = 180;
Run Code Online (Sandbox Code Playgroud)

另请参阅mysql.com 上的wait_timeoutInteractive_timeout