2015-06-25 19 views
7

Attualmente sto usando Flask-uWSGI-Websockets per fornire funzionalità websocket per la mia applicazione. Uso Flask-SQLAlchemy per connettermi al mio database MySQL.Flask-SQLAlchemy e Gevent che non chiudono le connessioni mysql

Flask-uWSGI-Websockets utilizza gevent per gestire le connessioni Websocket.

Il problema che sto avendo attualmente è che quando una connessione web-socket è terminata, la connessione al database impostata da Flask-SQLAlchemy continuerà a vivere.

Ho provato a chiamare db.session.close() e db.engine.dispose() dopo ogni connessione websocket, ma ciò non ha avuto alcun effetto.

Chiamare gevent.monkey.patch_all() all'inizio della mia app non fa differenza.

Una semplice rappresentazione di quello che sto facendo è questo:

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() 
+1

Sei sicuro che si raggiunge il codice di chiusura della sessione? può essere che invece venga sollevata un'eccezione? In tal caso inserisco il codice di chiusura della sessione nel corpo di un'istruzione 'finally' – architectonic

risposta

0

devo stessa situazione. e la soluzione per me si trova nel file di configurazione di MySQL my.cnf:

[mysqld] 
interactive_timeout=180 
wait_timeout=180 

è necessario riavviare il servizio mysql dopo salvare my.cnf.

se non si desidera riavviare il servizio mysql è possibile utilizzare query SQL:

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

Vedi anche wait_timeout e interactive_timeout su mysql.com

Problemi correlati