Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verursacht diese Thread-lokale Flask-SQLAchemy-Sitzung, dass der MySQL-Server weg ist?

Versuchen Sie, ein

hinzuzufügen

app.teardown_request(Exception=None)

Decorator, der am Ende jeder Anfrage ausgeführt wird. Ich habe derzeit ein ähnliches Problem und es scheint, als hätte ich es heute tatsächlich mit gelöst.

@app.teardown_request
def teardown_request(exception=None):
    Session.remove()
    if exception and Session.is_active:
        print(exception)
        Session.rollback()

Ich verwende Flask-SQLAlchemy nicht Nur rohes SQLAlchemy , daher kann es für Sie Unterschiede geben.

Aus den Dokumenten

In meinem Fall öffne ich eine neue scoped_session für jede Anfrage, sodass ich es am Ende jeder Anfrage entfernen muss (Flask-SQLAlchemy kann dies nicht erforderlich sein). Außerdem wird der Teardown_request-Funktion eine Exception übergeben wenn einer während des Kontexts aufgetreten ist. Wenn in diesem Szenario eine Ausnahme aufgetreten ist (die möglicherweise dazu führt, dass die Transaktion nicht entfernt wird oder ein Rollback erforderlich ist), prüfen wir, ob eine Ausnahme aufgetreten ist, und führen ein Rollback durch.

Wenn dies für meine eigenen Tests nicht funktioniert, war das nächste, was ich tun würde, ein session.commit() bei jedem Teardown, nur um sicherzustellen, dass alles gespült wird

UPDATE:Es scheint auch, dass MySQL Verbindungen nach 8 Stunden ungültig macht, wodurch die Sitzung beschädigt wird.

setzen Sie pool_recycle=3600 auf Ihrer Engine-Konfiguration oder auf eine Einstellung