2009-09-07 9 views
2

Est-il possible de spécifier le délai de connexion/requête pour les requêtes de base de données Oracle? Que ce soit du côté Oracle ou dans le pilote JDBC d'Oracle (10.2.0.4)? Donc, ce client Java vient de recevoir une erreur après, disons, 2 minutes au lieu d'attendre qu'Oracle ait fini d'exécuter la requête?Connexion Oracle/délai d'expiration de la requête

Répondre

4

Si vous exécutez la requête dans le contexte d'une transaction, la valeur du délai d'attente de transaction du moniteur de transaction JTA déterminera le délai d'expiration de la requête. La configuration pour cela dépend d'un serveur d'application à l'autre.

À un niveau de requête individuel (en l'absence d'un moniteur de transaction JTA), la méthode setQueryTimeout peut être utilisée pour définir le délai d'attente d'exécution d'un objet Statement/PreparedStatement/CallableStatement.

Mise à jour

setQueryTimeout est de ne pas être invoqué, même si cela fonctionne (atleast d'un client J2SE). Il fonctionne via le pilote JDBC effectuant un aller-retour complet vers le serveur de base de données Oracle. Ensuite, il est jusqu'à la base de données pour arrêter l'exécution de la requête. Ne comptez pas dessus pour des applications critiques dans le temps.

+1

Nous avons des problèmes avec le délai JTA car il n'affecte pas la requête en cours d'exécution. Et en fait, le serveur WebLogic sur lequel nous travaillons essaye de tuer la longue connexion et crée un autre thread pour le tuer, mais il bloque le verrou Java dans le pilote JDBC d'Oracle, provoquant ainsi l'attente des deux threads. Le problème est d'autant plus grave que WebLogic essaie de créer encore plus de threads meurtriers et finit par en manquer. –

+0

Le point sur setQueryTimeout semble très intressant et je n'y ai pas pensé avant actuallly :). Nous ne nous soucions pas vraiment si setQueryTimeout prendrait du temps pour annuler la requête, la chose principale ici est le résultat :). Je reviendrai sur les résultats du test. –

+1

La raison setQueryTimeout() peut ne pas fonctionner dans WLS, d'autant plus à cause de JTA. Je ne pense pas que le pilote répondra aux appels setQueryTimeout dans un contexte de transaction, mais je peux être incorrect. –

2

Jetez un coup d'œil aux profils Oracle. Cela vous permet de spécifier plusieurs limites au niveau de la base de données. L'un d'eux est un temps CPU maximum par requête.

Si vous avez des requêtes qui s'exécutent régulièrement pendant plus de 2 minutes, vous pouvez d'abord effectuer un réglage de vos requêtes.

+0

Les profils Oracle affectent toutes les requêtes pour l'utilisateur. Le PO pourrait être intéressé par une seule requête qui doit être annulée. –

+1

Mais, cela fonctionnerait comme une solution de force brute ;-) –

+0

Les profils Oracle seront notre prochaine étape si le setQueryTimeout ne fonctionne pas :). –

Questions connexes