2010-01-14 15 views
23

Come si interrompe una query MySQL in esecuzione a livello di programmazione?Come interrompere una query mysql in esecuzione

Il problema che sto affrontando è che una query è costruita utilizzando i dati forniti dall'utente e può richiedere occasionalmente molto tempo per l'esecuzione (tabelle di grandi dimensioni 15-30 milioni di righe). Voglio offrire all'utente un'opzione di annullamento, ma non so come fermare l'mysql-query attualmente in esecuzione.

L'applicazione è un'applet servlet Java: l'utente specifica i criteri nell'applet che viene passato al servlet dove viene creata una classe handler per gestire la richiesta. Questa classe di gestori è self-contained re connect - query - disconnect to mysql.

Dato questo scenario, come posso cancellare una mysql-query in esecuzione?

+0

Fare attenzione, se si sta uccidendo una query si bloccherà il tavolo – VKGS

risposta

39
SHOW PROCESSLIST; 
KILL <thread_to_be_killed>; 

fare riferimento alla documentazione per ulteriori dettagli

Show The Process List

Kill A Running Thread

+0

utilizzando KILL QUERY è leggermente preferibile a KILL per questo caso. In questo modo viene interrotta la query, ma non la connessione # ref il commento in "http://stackoverflow.com/questions/3787651/how-can-i-stop-a-running-mysql-query" –

0

È possibile emettere comandi specifici di MySQL attraverso le librerie standard forniti da MySQL ed eseguire KILL QUERY. Forse è meglio elencare i processi e capire quale thread è necessario uccidere per primo.

In base all'applicazione, ciò potrebbe tuttavia creare un problema di sicurezza (poiché è necessario concedere più privilegi all'utente della connessione).

2

È richiesta una connessione JDBC separata, il che significa che sarà necessario creare una nuova istanza del gestore database. Esegui l'istruzione SHOW PROCESSLIST, quindi esegui il loop dei risultati ed esegui un'istruzione KILL per ciascun ID di thread trovato per l'utente specificato.

L'unico modo affidabile che posso pensare di fare questo è che ogni utente dovrebbe accedere al database con un nome utente diverso, quindi ottenere tutti gli ID thread per quell'utente e uccidere tutti i loro thread.

Problemi correlati