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

So legen Sie ein Timeout für die MySQL-Abfrage mithilfe der C-API fest

Okay, ich habe eine Lösung gefunden. Danke an Will und PRR ( mein Kollege ).

Ich kann nicht Starten Sie für jede Abfrage einen neuen Thread, da dies eine Echtzeitanwendung ist, die mehr als 1000 Nachrichten pro Sekunde verarbeiten soll. stackoverflow.com/users/379897/r">R.. für die Idee).

Außerdem war es nicht möglich, die Verbindung über die Bibliothek zu beenden oder die Abfrage abzubrechen/zu beenden, da das Problem im DB-Server lag..

Und hier ist eine Brute-Force-Lösung, aber immer noch viel besser als _EXIT( FAILURE ) :Hier ist die verwandte Frage:"How to force close Socket unter Linux?" - also habe ich gerade den Socket mit einem Systemaufruf geschlossen.

Wichtiger HINWEIS :(danke Will) - Es stellte sich heraus, dass unser MySQL-Bibliotheks-Wrapper ein "fail-safe"-Flag hat, so dass er bei geschlossenem Socket (oder einem anderen kritischen Fehler) versucht, das Problem zu "lösen", also den Socket erneut öffnet , in meinem Fall von selbst. Also habe ich diese Option einfach ausgeschaltet und jetzt ist alles in Ordnung - die Ausführung wird wegen einer Ausnahme abgebrochen - das ist die "weichste" Art, dies zu tun.
Dies sollte natürlich über einen anderen Thread erfolgen - a Timer, zum Beispiel.

BEARBEITEN: Die Timeouts funktionieren wirklich für Versionen nach 5.0.25. Aber zumindest auf RHEL4 und RHEL5 werden die Timeouts aus irgendeinem Grund verdreifacht! Wenn zum Beispiel einige der Zeitüberschreitungen auf 20 Sekunden eingestellt sind, beträgt die tatsächliche Zeitüberschreitung ~60 Sekunden.
Ein weiterer wichtiger Punkt ist, dass diese Zeitüberschreitungen (wie alle anderen Optionen) MÜSSEN nach gesetzt werden mysql_init und vorher mysql_connect oder mysql_real_connect .