2010-01-14 15 views
23

Wie kann ich eine laufende mysql-Abfrage programmgesteuert stoppen?So stoppen Sie eine laufende MySQL-Abfrage

Das Problem, mit dem ich konfrontiert bin, ist, dass eine Abfrage unter Verwendung von vom Benutzer bereitgestellten Daten erstellt wird und gelegentlich sehr lange dauern kann (große Tabellen 15 - 30 Millionen Zeilen). Ich möchte dem Benutzer eine Cancel-Option anbieten, weiß aber nicht, wie ich die aktuell ausgeführte mysql-Abfrage stoppen kann.

Die Anwendung ist ein Java-Applet-Servlet: Der Benutzer gibt Kriterien im Applet an, die an das Servlet übergeben werden, wo eine Handler-Klasse zur Verarbeitung der Anfrage erstellt wird. Diese Handler-Klasse ist in sich abgeschlossen. Re connect - query - trenne die Verbindung zu mysql.

In diesem Szenario, wie kann ich eine laufende mysql-Abfrage abbrechen?

+0

Tun Sie es vorsichtig, wenn Sie eine Abfrage töten wird Ihre Tabelle – VKGS

Antwort

39
SHOW PROCESSLIST; 
KILL <thread_to_be_killed>; 

für weitere Informationen in der Dokumentation

Show The Process List

Kill A Running Thread

+0

mit KILL QUERY ist etwas leichter zu töten für diesen Fall. Auf diese Weise wird die Abfrage getötet, aber nicht die Verbindung Ref # der Kommentar in "http://stackoverflow.com/questions/3787651/how-cani-i-stop-a-running-mysql-query" –

0

Sie können ausgeben MySQL spezifische Befehle durch die Standardbibliotheken von MySQL zur Verfügung gestellt und KILL QUERY laufen. Möglicherweise ist es am besten, die Prozesse aufzulisten und herauszufinden, welchen Thread Sie zuerst töten müssen.

Abhängig von Ihrer Anwendung kann dies jedoch zu einem Sicherheitsproblem führen (da Sie dem Benutzer der verbindenden Anwendung mehr Rechte geben müssen).

2

Eine separate JDBC-Verbindung ist erforderlich. Das bedeutet, dass Sie eine neue Datenbankhandlerinstanz erstellen müssen. Führen Sie SHOW PROCESSLIST Anweisung aus und durchlaufen Sie dann die Ergebnisse und führen Sie eine KILL-Anweisung für jede Thread-ID aus, die für den angegebenen Benutzer gefunden wurde.

Die einzige zuverlässige Möglichkeit, die ich mir vorstellen kann, ist, dass sich jeder Benutzer in der Datenbank unter einem anderen Benutzernamen anmelden muss, dann alle Thread-IDs für diesen Benutzer abruft und alle Threads abbricht.

Verwandte Themen