2010-03-04 20 views
21

Ero curioso di sapere come il thin client Oralce JDBC implementa il timeout della query. Questo può essere impostato chiamando il metodo java.sql.Statement setQueryTimeout (int secondi) .Come viene implementato il timeout della query JDBC di Oracle?

È implementato nel driver stesso sul lato client? È un nuovo thread generato e aggiunto? Oppure il driver JDBC semplicemente invia un parametro a Oracle e quindi applica il timeout?

Dopo il timeout, quali risorse sul client e il database vengono rilasciate e quali sono presenti? Oracle continua per eseguire la query anche se il client lo ha abbandonato o è terminato? C'è ancora un oggetto cursore sul lato client?

Grazie

risposta

11

Tanel Poder ha scritto un article su come funziona Annulla tramite OCI (Oracle Call Interface). Immagino che qualcosa di simile sia fatto per JDBC. Se si utilizza il driver thick, tramite OCI, è possibile provare a tracciare la sessione (tramite le impostazioni sqlnet.ora) e vedere cosa viene registrato.

+0

Quindi, questo significa che il driver JDBC genera un altro passo per la query e attende che scada e quindi invia un messaggio OCICancel? – oneself

+0

Impossibile dire se si tratta di un thread separato o di un ciclo che dice "Qualsiasi cosa dal server ... è scaduta ... qualsiasi cosa dal server ... è scaduta ..." –

1

So che la query non continua sul lato server quando viene raggiunto il timeout. C'è un'opzione di intenzione/segnale inviata al server prima o dopo il timeout per indicare che il server deve fermarsi. Ho verificato questo cercando sul server in varie tabelle V $ per vedere se la query è in esecuzione. (V $ SESSION, V $ SQL, ecc.)

2

Quando una query è effettivamente in timeout quando si utilizza il metodo setTimeOut, un'eccezione SQL con il codice di errore Oracle ORA-01013 - user requested cancel of current operation viene generata dal server Oracle.

Ciò significa che l'operazione è stata annullata grazia (per quanto Oracle è interessato/tanto Oracle può) - perché è oracolo l'invio del messaggio.

15

Secondo Oracle JDBC FAQ

filo Statement timeout. Questo thread viene creato se si esegue una dichiarazione con un timeout. Viene creato un solo thread, indipendentemente dal numero di istruzioni o connessioni. Questo thread dura la durata della VM.

Problemi correlati