Flask-SQLAlchemy y Gevent no cierran las conexiones de mysql
uwsgi (1)
Actualmente estoy usando Flask-uWSGI-Websockets para proporcionar la funcionalidad de websocket para mi aplicación. Uso Flask-SQLAlchemy para conectarme a mi base de datos MySQL.
Flask-uWSGI-Websockets utiliza gevent para administrar conexiones de websocket.
El problema que tengo actualmente es que cuando finaliza una conexión websocket, la conexión de la base de datos configurada por Flask-SQLAlchemy seguirá funcionando.
Intenté llamar a db.session.close()
y db.engine.dispose()
después de cada conexión websocket, pero esto no tuvo ningún efecto.
Llamar a gevent.monkey.patch_all()
al comienzo de mi aplicación no hace la diferencia.
Una simple representación de lo que estoy haciendo es esto:
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()
Tengo la misma situación. y una solución para mí ubicada en el archivo de configuración mysql my.cnf
:
[mysqld]
interactive_timeout=180
wait_timeout=180
debe reiniciar el servicio mysql después de guardar my.cnf.
si no desea reiniciar el servicio mysql, puede usar consultas SQL:
SET GLOBAL interactive_timeout = 180;
SET GLOBAL wait_timeout = 180;
Consulte también wait_timeout e interactive_timeout en mysql.com