sqlalchemy flask-sqlalchemy uwsgi gevent

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