Gibt es eine Möglichkeit, eine MySql-Abfrage abzubrechen, wenn DBI und dbGetQuery verwendet werden?

8

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?

    
d8aninja 03.07.2017, 18:54
quelle

1 Antwort

3

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.

Vorgeschlagene Lösung:

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.

MySql Beispiel:

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.

    
Technophobe01 09.07.2017, 17:31
quelle

Tags und Links