Ich erkenne das
dbGetQuery comes with a default implementation that calls dbSendQuery, then dbFetch, ensuring that the result is always freed by dbClearResult.
und
dbClearResult frees all resources (local and remote) associated with a result set. In some cases (e.g., very large result sets) this can be a critical step to avoid exhausting resources (memory, file descriptors, etc.)
Aber mein Team hat gerade eine gesperrte Tabelle erlebt, die wir in MySQL zu kill pid
gebracht haben, und ich frage mich - gibt es eine Möglichkeit, eine mit dem Paket DBI
übermittelte Anfrage abzubrechen?
Ich suche und finde nicht das Äquivalent von
dbGetQuery(conn = connection, 'select stuff from that_table', timeout = 90)
Ich habe das versucht und die Funktion mit und ohne Parametersatz profiliert und es scheint nichts zu tun; Warum sollte es, wenn dbClearResult
immer im Spiel ist?
Wenn ich Ihre Frage richtig lese, müssen Sie sich darauf verlassen, dass Ihr MySQL-Server Ihr erforderliches Abfrage-Timeout implementiert. Warum? dbQuery
sendet eine Clientanforderung an den Server, auf dem der Server die Abfrage und das Zeitlimit ausführen soll.
Fügen Sie einen Anweisungsausführungshinweis in die Abfrage ein, die Sie an Ihre MySQL-Datenbank senden.
nb. Die zurückgegebenen Abfragedaten sind möglicherweise zu groß für Sie, aber das ist ein anderes Problem.
Der MAX_EXECUTION_TIME Hinweis ist nur für SELECT -Anweisungen zulässig. Es legt ein Limit N (ein Timeout-Wert in Millisekunden) fest, wie lange eine SQL-Anweisung ausgeführt werden darf, bevor der Server sie beendet.
%Vor%Beispiel mit einem Timeout von 1 Sekunde (1000 Millisekunden):
%Vor%Der MAX_EXECUTION_TIME (N) Hinweis setzt ein Zeitlimit für die Ausführung von Anweisungen in N Millisekunden. Wenn diese Option nicht vorhanden ist oder N 0 ist, gilt das von der Systemvariable max_execution_time festgelegte Anweisungstimeout.
Der MAX_EXECUTION_TIME Hinweis ist wie folgt anwendbar:
Für Anweisungen mit mehreren SELECT -Schlüsseln, z. B. Vereinigungen oder Anweisungen mit Unterabfragen, gilt MAX_EXECUTION_TIME für die gesamte Anweisung und muss nach dem ersten SELECT .
Dies gilt für schreibgeschützte SELECT -Anweisungen. Anweisungen, die nicht schreibgeschützt sind, rufen eine gespeicherte Funktion auf, die Daten als Nebeneffekt ändert.
Es gilt nicht für SELECT -Anweisungen in gespeicherten Programmen und wird ignoriert.
Ich hoffe, dass der obige Ansatz Sie in die richtige Richtung bewegt.