Ich weiß, dass es hier viele ähnliche Fragen gibt, auch wenn es viele Ergebnisse gibt, wenn ich es google, aber keiner von ihnen beantwortet meine Frage. Ich lese dies , dies , this und dies , aber keiner von ihnen funktioniert für mich . Ich spreche nicht über irgendwelche Sperren, ich möchte dies nicht mit MySQL C ++ - Connector tun, nur die C-API.
Auch, was hier sehr wichtig ist: Ich mache das auf LINUX. Warum erwähne ich das? Weil in der Dokumentation für mysql_options:
%Vor%Also, gibt es eine Möglichkeit, ein Abfrage-Timeout für Versionen vor 5.0.25 zu setzen?
Meine MySQL-Version:
%Vor%BEARBEITEN: Gibt es zumindest eine Möglichkeit, eine Abfrage abzubrechen? Ich kann einen Timer als anderen Thread starten, aber wenn er abläuft .. kann ich die Anfrage irgendwie abbrechen?
Okay, ich habe eine Lösung gefunden .. Danke Will und PRR (mein Kollege).
Ich kann bei jeder Abfrage keinen neuen Thread starten, da es sich um eine Echtzeitanwendung handelt, die mehr als 1000 Nachrichten pro Sekunde verarbeiten soll. (Dank R .. für die Idee).
Es war auch 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: " Wie erzwinge das Schließen von Socket unter Linux? " - also habe ich den Socket gerade mit einem Systemaufruf geschlossen.
Wichtiger Hinweis : (Danke Will) - Es hat sich herausgestellt, dass unser MySQL-Wrapper eine "fail-safe" -Flagge hat, so dass es bei geschlossenem Socket (oder anderen kritischen Fehlern) versucht um das Problem zu "lösen", so öffnet es in meinem Fall die Steckdose von selbst. Also, ich habe diese Option einfach ausgeschaltet und jetzt ist alles in Ordnung - die Ausführung wird wegen einer Ausnahme beendet - das ist der "weichste" Weg, dies zu tun.
Dies sollte natürlich durch einen anderen Thread erfolgen - zum Beispiel einen Timer.
BEARBEITEN: Die Timeouts funktionieren wirklich für Versionen nach 5.0.25. Aber zumindest auf RHEL4 und RHEL5 sind die Timeouts aus irgendeinem Grund verdreifacht! Wenn beispielsweise einige Timeouts auf 20 Sekunden festgelegt sind, beträgt das tatsächliche Timeout ~ 60 Sekunden.
Eine weitere wichtige Sache ist, dass diese Timeouts (wie alle anderen Optionen) MUSS nach mysql_init
und vor mysql_connect
oder gesetzt werden müssen %Code%.
Ich nehme an, Sie könnten ein Timeout für den C-Funktionsaufruf implementieren (wie in diesem Thread beschrieben) C ++: Wie implementiere ich ein Timeout für einen beliebigen Funktionsaufruf? ), aber Sie müssten sich genau überlegen, in welcher Art von Staat Sie die DB einlassen würden - vermutlich Diese dienen nur zum Lesen der Datenbank, nicht zum Einfügen / Aktualisieren.
Ich habe das nie versucht, aber ich habe gelesen, und ich denke, das könnte bedeuten, dass MYSQL_OPT_WRITE_TIMEOUT und MYSQL_OPT_READ_TIMEOUT nur für Windows vorher MySQL Version 5.0.25 sind, aber jetzt für jede TCP / IP-Verbindung funktionieren sollten. Nehmen Sie einen hier
Grüße
BEARBEITEN: Ich würde versuchen, meinen mysql-Server auf eine neuere Version zu aktualisieren und zu versuchen, ob es funktioniert.
Wenn es Ihnen nichts ausmacht, Threads zu verwenden, könnten Sie die Abfrage von einem neuen Thread aus starten und den Haupt-Thread dazu veranlassen, eine kurze pthread_cond_timedwait
für den neuen Thread auszuführen, um eine Bedingungsvariable für die Verbindung festzulegen. Dann können Sie den Thread verweilen lassen, bis der tatsächliche mysql-Aufruf abgelaufen ist. Stellen Sie nur sicher, dass es losgelöst ist, damit seine Ressourcen freigegeben werden, wenn es endlich eine Auszeit gibt. Diese Lösung ist nicht schön, aber es sollte zumindest funktionieren.