Frage

Was ist der richtige Weg, Timeouts zu steuern, von dem Client, wenn sie gegen eine MySQL-Datenbank ausgeführt wird, mit SQLAlchemy? Die connect_timeout URL-Parameter scheint nicht ausreichend zu sein.

Ich bin mehr daran interessiert, was passiert, wenn die Maschine, dass die Datenbank auf ausgeführt wird, beispielsweise unerwartet aus dem Netz verschwindet. Ich bin nicht besorgt über die Abfragen selbst zu lange dauert.

Das folgende Skript tut, was man erwarten würde (das heißt, die Zeit, nachdem es aus etwa einer Sekunde), wenn some ist nicht verfügbar vor die while Schleife jemals erreicht ist. Aber wenn some geht bei der while Schleife (beispielsweise versuchen, seine Netzwerkkabel reißen aus, nachdem die Schleife begonnen hat), dann scheint das Timeout mindestens 18 Sekunden dauern. Gibt es eine zusätzliche Einstellung oder Parameter fehlt mir?

Es ist nicht verwunderlich, dass die wait_timeout Session-Variablen nicht funktioniert, wie ich denke, das ist eine serverseitige Variable. Aber ich warf es dort nur um sicher zu machen.

from sqlalchemy import *
from sqlalchemy.exc import *
import time
import sys

engine = create_engine("mysql://user:password@somehost/test?connect_timeout=1")
try:
    engine.execute("set session wait_timeout = 1;")
    while True:
        t = time.time()
        print t
        engine.execute("show tables;")
except DBAPIError:
    pass
finally:
    print time.time() - t, "seconds to time out"
War es hilfreich?

Lösung

Dies ist nicht möglich, aufgrund der Art und Weise TCP funktioniert. wenn der andere Computer auf das Netzwerk abfällt, wird es einfach aufhören, um eingehende Pakete zu reagieren. die „18 Sekunden“ Sie sehen etwas auf dem TCP-Stack Timing aus, da keine Antwort ist.

Nur so können Sie Ihr gewünschtes Verhalten bekommen können, ist der Computer zu haben, erzeugt eine „ich sterbe“ Nachricht unmittelbar bevor er stirbt. die, wenn der Tod unerwartet ist, ist völlig unmöglich.

haben Sie schon einmal von hearbeats gehört? das sind Pakete, die hochverfügbare Systeme miteinander kennen jede Sekunde oder weniger zu lassen, die andere senden sie noch existieren. Wenn Sie Ihre Anwendung „sofort“ zu wissen, dass der Server weg ist, müssen Sie zunächst entscheiden, wie lange „immediate“ ist (1 Sekunde, 200 ms, etc.) und entwickelten dann ein System (wie Herzklopfen) zu erkennen, wenn das andere System ist nicht mehr da.

Andere Tipps

Könnte dies ein Fehler in der mysql / Python-Anschluss sein? https://bugs.launchpad.net/myconnpy/+bug/328998 das sagt die Zeit, um 10 Sekunden hartcodiert ist.

Um wirklich zu sehen, wo der Zusammenbruch ist, können Sie einen Paket-Sniffer verwenden könnten, das Gespräch zwischen dem Server und dem Client zur Kasse. wireshark + tcpdump funktioniert gut für diese Art der Sache.

Ich glaube, Sie sind einen ganz anderen Fehler zu erreichen, dann ist dies ein gefürchteter Fehler „mysql verschwunden ist:“ Wenn ich richtig die Lösung bin, ist auf einen neuen mysqldb Treiber zu aktualisieren, da die Bug-Patches im Treiber war.

Wenn Sie aus irgendeinem Grund nicht / nicht aktualisieren, sollten Sie die SA-Fix für diese versuchen

db= create_engine('mysql://root@localhost/test', pool_recycle=True) 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top