web-dev-qa-db-fra.com

Comment le délai d'attente des requêtes JDBC d'Oracle est-il mis en œuvre?

J'étais curieux de savoir comment le client léger Oralce JDBC implémentait l'expiration du délai de requête. Cela peut être défini en appelant la méthode setQueryTimeout (int seconds) de Java.sql.Statement.

Est-ce que cela est implémenté dans le pilote lui-même du côté client? Un nouveau fil est-il créé et rejoint? Ou bien le pilote JDBC envoie-t-il simplement un paramètre à Oracle, puis applique-t-il le délai?

Une fois le délai écoulé, quelles ressources du client et de la base de données sont publiées et lesquelles traînent? Oracle continue-t-il à exécuter la requête même si le client l'a abandonnée ou est-il terminé? Y a-t-il encore un objet curseur du côté client?

Je vous remercie

21
oneself

Tanel Poder a écrit un article sur le fonctionnement d'une annulation via OCI (Oracle Call Interface). Je suppose que quelque chose de similaire est fait pour JDBC. Si vous utilisez le pilote lourd, via OCI, vous pouvez essayer de suivre la session (via les paramètres sqlnet.ora) et voir ce qui est enregistré.

12
Gary Myers

Selon Oracle JDBC FAQ

Thread de délai d'instruction. Ce thread est créé si vous exécutez une instruction avec un délai d'expiration. Un seul thread est créé, quel que soit le nombre d'instructions ou de connexions. Ce thread dure toute la vie de la machine virtuelle.

15
Janek Bogucki

Lorsqu'une requête expire réellement lors de l'utilisation de la méthode setTimeOut, une exception SQL avec le code d'erreur Oracle ORA-01013 - user requested cancel of current operation est levée à partir du serveur Oracle.

Cela signifierait que l'opération a été annulée gracieusement (en ce qui concerne Oracle/autant que Oracle peut le faire) - car c'est Oracle qui envoie ce message.

2
Nivas

Je sais que la requête ne continue pas côté serveur lorsque le délai d'attente est atteint. Certaines options d'intention/signal sont envoyées au serveur avant ou après le délai imparti pour indiquer que le serveur doit s'arrêter. J'ai vérifié cela en consultant le serveur dans diverses tables V $ pour voir si la requête était en cours d'exécution. (V $ SESSION, V $ SQL, etc.)

1
Kevin