Vermeiden von "MySQL Server ist weg" auf selten genutzten Python / Flask Server mit SQLAlchemy

Wie kann Flask / SQLAlchemy konfiguriert werden, um eine neue Datenbankverbindung zu erstellen, wenn eine nicht vorhanden ist?

Ich habe einen selten besuchten Python / Flask-Server, der SQLAlchemy verwendet. Es wird alle paar Tage besucht, und beim ersten Besuch wirft es oft einen "MySQL Server ist weg" Fehler. Nachfolgende Seitenansichten sind in Ordnung, aber es sieht unprofessionell aus, diesen Anfangsfehler zu haben.

Ich würde gerne die richtige Art und Weise kennen lernen – Ratschläge wie "machen eine wirklich lange Zeit", was etwa 4 Tage lang in diesem Fall wäre, scheint nicht richtig zu sein. Wie kann ich den Mangel an einer Datenbankverbindung testen und bei Bedarf einen erstellen?

4 Solutions collect form web for “Vermeiden von "MySQL Server ist weg" auf selten genutzten Python / Flask Server mit SQLAlchemy”

Ich hatte Schwierigkeiten mit diesem vor, und festgestellt, dass der Weg, um es zu behandeln ist durch nicht halten Sitzungen um. Das Problem ist, dass du versuchst, eine Verbindung zu lange zu öffnen. Stattdessen verwenden Sie eine Thread lokalen Scoped Session wie entweder entweder in __init__.py oder in einem Utility-Paket, das Sie überall importieren:

 from sqlalchemy.orm import scoped_session, sessionmaker Session = scoped_session( sessionmaker() ) 

Dann richten Sie Ihre Motoren und Metadaten einmal ein. Dies ermöglicht Ihnen, die Konfigurationsmechanik jedes Mal zu überspringen, wenn Sie eine Verbindung herstellen / trennen. Danach kannst du deine db Arbeit so machen:

 session = Session() someObject = session.query( someMappedClass ).get( someId ) # use session like normal ... session.close() 

Wenn du an alten Objekten festhalten möchtest und du deine Session nicht offen lassen willst, dann kannst du das obige Muster benutzen und alte Objekte wie folgt wiederverwenden:

 session = Session() someObject = session.merge( someObject ) # more db stuff session.close() 

Der Punkt ist, Sie wollen Ihre Sitzung zu öffnen, machen Sie Ihre Arbeit, dann schließen Sie Ihre Sitzung. Dies vermeidet Timeouts sehr gut. Es gibt viele Optionen für .merge und .add, die es Ihnen erlauben, entweder Änderungen an fremden Objekten vorzunehmen oder neue Daten aus dem db zu laden. Die Docs sind sehr ausführlich, aber sobald du weißt, was du suchst, könnte es ein bisschen leichter zu finden sein.

Um den ganzen Weg dorthin zu bekommen und zu verhindern, dass die MySQL von "weggehen" ist, musst du das Problem deines Verbindungspools lösen, die Verbindungen zu lange offen halten und eine alte Verbindung für dich ausprobieren.

Um eine neue Verbindung zu erhalten, kannst du die Option pool_recycle in deinem create_engine Aufruf create_engine . Setzen Sie diesen pool_recycle auf die Anzahl der Sekunden im Verbindungspool zwischen den Kassen, die eine neue Verbindung erstellen soll, anstelle einer vorhandenen Verbindung, die zurückgegeben werden soll.

Ich hatte ein ähnliches Problem, aber für mich würde ich die "MySQL ist weg" Fehler irgendwo zwischen 5 Minuten und 2 Stunden von jeder Sitzung bekommen.

Ich benutze Flask-SQLAlchemy, also soll es die Leerlauf-Verbindungen schließen, aber schien das nicht zu tun, es sei denn, die Verbindung war über ein paar Stunden untätig gewesen.

Schließlich verengte ich es auf die folgenden Flask-SQLAlchemy-Einstellungen:

 app.config['SQLALCHEMY_POOL_SIZE'] = 100 app.config['SQLALCHEMY_POOL_RECYCLE'] = 280 

Die Voreinstellungen für diese sind 10 bzw. 7200 (2 Stunden).

Es ist eine Frage des Spiels mit diesen Einstellungen, um Ihre Umgebung zu passen.

Zum Beispiel würde ich an vielen Orten lesen, dass SQLALCHEMY_POOL_RECYCLE auf 3600 gesetzt werden sollte, aber das hat nicht für mich gearbeitet. Ich bin Hosting mit PythonAnywhere und sie töten Leerlauf MySQL-Verbindungen nach 5 Minuten (300 Sekunden). So Einstellung meines Wertes auf weniger als 300 löste das Problem.

Ich hoffe das hilft anderen, weil ich zu viel Zeit zu diesem Thema verschwendet habe.

http://flask-sqlalchemy.pocoo.org/2.1/config/#configuration-keys

WENN Sie Flask-SQLAlchemy verwenden:

Scheint wie ein fix ist verfügbar: https://github.com/mitsuhiko/flask-sqlalchemy/issues/2

Leider ist die Standardinstallation (pip install flask-sqlalchemy) den Patch noch nicht richtig, insbesondere zu diesem Thema: https://github.com/e-dard/flask-sqlalchemy/commit/cf659f346e005d34257d256fa4c42889741fc31f

Getting die neueste Version von github sollte es beheben.

2017 Antwort: In SQLAlchemy v1.2.0 + hast du die Verbindungspool-Pre-Ping- Funktion zur Verfügung, um dieses Problem von "MySQL-Server ist weg" zu lösen.

Verbindungspool-Pre-Ping – Der Verbindungspool enthält jetzt eine optionale "Pre-Ping" -Funktion, die die "Lebendigkeit" einer gepoolten Verbindung für jede Verbindungsabfrage testet und die DBAPI-Verbindung transparent verteilt, wenn die Datenbank getrennt ist. Diese Funktion eliminiert die Notwendigkeit für die "Pool Recycling" -Flag sowie die Frage der Fehler aufgeworfen, wenn eine gepoolte Verbindung nach einem Neustart der Datenbank verwendet wird.

Release 1.2.0b1 ist jetzt hier, also kannst du es heute benutzen Die Freigabe ist auf PyPI verfügbar, aber da es derzeit noch in der Beta ist, müssen Sie die –pre-Flagge bei der Installation mit Pip angeben.

Python ist die beste Programmiersprache der Welt.