Oracle
 sql >> Database >  >> RDS >> Oracle

Quando chiamo PreparedStatement.cancel() in un'applicazione JDBC, lo uccide effettivamente in un database Oracle?

Si prega di notare che ciò che dico di seguito si basa su osservazioni e inferenze di Oracle in uso e non su una profonda comprensione degli interni di Oracle. Nessuno di essi deve essere considerato autorevole.

Ciò che i nove hanno detto nel loro primo paragrafo è corretto. Tuttavia, attenzione al test suggerito. Non tutte le query Oracle di lunga durata sono le stesse. Sembra che le query vengano valutate in due fasi, prima una fase che combina dati sufficienti per sapere come restituire le righe nell'ordine corretto, e seconda una fase che restituisce le righe riempiendo gli spazi vuoti che non ha calcolato nel prima fase. La divisione del lavoro tra le due fasi è influenzata anche dalle impostazioni dell'ottimizzatore basato sui costi. per esempio. Prime righe vs Tutte le righe.

Ora, se la query è nella fase 1, la richiesta di annullamento sembra al massimo essere accodata per essere applicata alla fine della fase 1, il che significa che la query continua a funzionare.

Nella fase 2, le righe vengono restituite in gruppi e, dopo ogni gruppo, il comando di annullamento può avere effetto, quindi supponendo che il driver supporti il ​​comando, la richiesta di annullamento comporterà l'eliminazione della query.

La specifica per il comando JDBC cancel non sembra dire cosa dovrebbe succedere se la query non smette di funzionare, e quindi il comando potrebbe attendere la conferma dell'uccisione, o potrebbe scadere e tornare con la query ancora in esecuzione.