Flask-SQLAlchemy и Gevent не закрывают соединения mysql

В настоящее время я использую Flask-uWSGI-Websockets для предоставить функциональность веб-сокета для моего приложения. Я использую Flask-SQLAlchemy для подключения к моей базе данных MySQL.

Flask-uWSGI-Websockets использует gevent для управления подключениями к веб-сокетам.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что после завершения соединения с веб-сокетом соединение с базой данных, установленное Flask-SQLAlchemy, будет продолжать жить.

Я пробовал вызывать db.session.close() и db.engine.dispose() после каждого подключения к веб-сокету, но это не имело никакого эффекта.

Вызов 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()

person jaapz    schedule 25.06.2015    source источник
comment
вы уверены, что код закрытия сеанса достигнут? может быть, вместо этого возникает исключение? В таком случае я бы поместил код закрытия сеанса в тело оператора finally.   -  person architectonic    schedule 17.09.2015


Ответы (1)


У меня такая же ситуация. и решение для меня находится в файле конфигурации mysql my.cnf:

[mysqld]
interactive_timeout=180
wait_timeout=180

после сохранения my.cnf необходимо перезапустить службу mysql.

если вы не хотите перезапускать службу mysql, вы можете использовать sql-запросы:

SET GLOBAL interactive_timeout = 180;
SET GLOBAL wait_timeout = 180;

См. Также wait_timeout и interactive_timeout на mysql.com

person vanzhiganov    schedule 17.05.2017