sqlalchemy - फ्लास्क-एसक्यूएललेमी और जियवेंट, MySQL कनेक्शन बंद नहीं करना



flask-sqlalchemy uwsgi (1)

मैं वर्तमान में अपने आवेदन के लिए websocket कार्यक्षमता प्रदान करने के लिए फ्लास्क-यूडब्ल्यूएसजीआई-वेबकॉट्स का उपयोग कर रहा हूं। मैं अपने MySQL डाटाबेस से कनेक्ट करने के लिए फ्लास्क-एसक्यूएलकेमी का उपयोग करता हूं।

फ्लास्क-यूडब्ल्यूएसजीआई-वेबकैकेट वेबकट कनेक्शन का प्रबंधन करने के लिए गैगेट का उपयोग करता है।

वर्तमान में समस्या यह है कि जब एक websocket कनेक्शन समाप्त हो गया है, फ्लास्क- SQLAlchemy द्वारा स्थापित डेटाबेस कनेक्शन रहने पर रहेंगे

मैंने प्रत्येक websocket कनेक्शन के बाद 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()

मेरे पास एक ही स्थिति है और मेरे लिए mysql विन्यास फाइल में स्थित समाधान my.cnf :

[mysqld]
interactive_timeout=180
wait_timeout=180

my.cnf सहेजने के बाद आपको mysql सेवा को पुनरारंभ करना होगा

यदि आप mysql सेवा को पुनरारंभ नहीं करना चाहते हैं तो आप एसक्यूएल क्वेरीज़ का उपयोग कर सकते हैं:

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

Mysql.com पर wait_timeout और interactive_timeout भी देखें