Wie kontrollierst du MySQL Timeouts von SQLAlchemy?

8

Was ist der richtige Weg, um Timeouts vom Client aus zu steuern, wenn Sie mit SQLAlchemy gegen eine MySQL-Datenbank laufen? Der Parameter connect_timeout URL scheint nicht ausreichend zu sein.

Ich bin mehr daran interessiert, was passiert, wenn der Computer, auf dem die Datenbank ausgeführt wird, z. B. unerwartet aus dem Netzwerk verschwindet. Ich mache mir keine Sorgen, dass die Fragen selbst zu lange dauern.

Das folgende Skript führt das aus, was Sie erwarten würden (d. h. Zeitüberschreitung nach ungefähr einer Sekunde), wenn somehost nicht verfügbar ist bevor die while -Schleife erreicht wird. Wenn somehost während der while -Schleife abstürzt (z. B. wenn Sie versuchen, das Netzwerkkabel nach dem Start der Schleife zu entfernen), dann scheint das Zeitlimit mindestens 18 zu betragen Sekunden. Gibt es einige zusätzliche Einstellungen oder Parameter, die ich vermisse?

Es ist nicht verwunderlich, dass die Sitzungsvariable wait_timeout nicht funktioniert, da ich denke, dass dies eine serverseitige Variable ist. Aber ich habe es reingeworfen, nur um sicherzugehen.

%Vor%     
Jacob Gabrielson 30.07.2009, 21:59
quelle

3 Antworten

5

Dies ist aufgrund der Funktionsweise von TCP nicht möglich. Wenn der andere Computer das Netzwerk verlässt, reagiert er nicht mehr auf eingehende Pakete. Die "18 Sekunden", die Sie sehen, ist etwas auf Ihrem TCP-Stack, das wegen keiner Antwort ausläuft.

Die einzige Möglichkeit, Ihr gewünschtes Verhalten zu erreichen, besteht darin, dass der Computer unmittelbar vor dem Tod eine Nachricht "Ich sterbe" generiert. was, wenn der Tod unerwartet ist, völlig unmöglich ist.

Hast du schon mal von Hearbeats gehört? Das sind Pakete, die Systeme mit hoher Verfügbarkeit jede Sekunde oder weniger senden, um dem anderen mitzuteilen, dass sie noch existieren. Wenn Sie möchten, dass Ihre Anwendung "sofort" weiß, dass der Server weg ist, müssen Sie zuerst entscheiden, wie lang "sofort" ist (1 Sekunde, 200 ms, usw.) und dann ein System (zB Heartbeats) entwickeln, um zu erkennen wann das andere System ist nicht mehr da.

    
longneck 28.08.2009, 19:42
quelle
1

Könnte das ein Fehler im mysql / python Connector sein? Ссылка was besagt, dass die Zeit bis 10 Sekunden hart-codiert ist.

Um wirklich zu sehen, wo der Zusammenbruch ist, könnten Sie einen Paket-Sniffer verwenden, um die Konversation zwischen dem Server und dem Client auszuprobieren. Wireshark + Tcpdump funktioniert gut für diese Art von Sache.

    
txyoji 21.08.2009 02:26
quelle
1

Ich glaube, Sie erreichen einen völlig anderen Fehler, das ist ein gefürchteter "mysql ist weggegangen" -Fehler. Wenn ich Recht habe, ist die Lösung, auf einen neueren mysqldb-Treiber zu aktualisieren, da der Fehler im Treiber Patches gewesen ist.

Wenn Sie aus irgendeinem Grund nicht aktualisieren können / wollen, sollten Sie das SA-Update für dieses Problem versuchen

%Vor%     
Jorge Vargas 23.08.2009 14:30
quelle

Tags und Links