7
votes

Oracle Connection / Délai de requête

est-il possible de spécifier le délai de connexion / requête pour les requêtes de base de données Oracle? Soit sur le côté Oracle ou dans le pilote JDBC d'Oracle (10.2.0.4)? Donc, ce client Java vient d'avoir une erreur de retour après, disons, 2 minutes au lieu d'attendre jusqu'à la fin de l'exécution de l'exécution de la requête?


4 Réponses :


8
votes

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

à un niveau de requête individuel (en l'absence d'un moniteur de transaction JTA), le SetqueryTimeout La méthode peut être utilisée pour définir le délai d'exécution d'une déclaration / objet préparé / callableStatement.

mise à jour

SetqueryTimeOut ne doit pas être invoqué, bien que cela fonctionne (au moins à partir d'un client J2SE). Il fonctionne via le pilote JDBC effectuant un aller-retour complet sur le serveur de base de données Oracle. Ensuite, il appartient à la base de données pour arrêter l'exécution de la requête. Ne comptez pas sur elle pour des applications critiques de temps.


7 commentaires

Nous avons des problèmes avec le délai d'attente JTA car cela n'affecte pas la requête en cours. Et réellement serveur weblogic que nous exécutons sur les essais pour tuer la connexion longue course et crée un autre fil pour le tuer, mais il frappe le verrouillage Java dans le pilote Oracle JDBC, entraînant ainsi une attente des deux threads. Le problème devient encore pire alors que Weblogic tente de créer encore plus de threads tueurs et de l'éventuellement.


Le point sur SetQueryTimeout semble très intéressant et je n'ai pas pensé à cela avant d'agir :). Nous ne nous soucions pas vraiment si Setquerytimeout prendra du temps pour annuler la requête, la principale chose ici est le résultat :). Je reviendrai sur les résultats du test.


La raison série SetqueryTimeOut () pourrait ne pas fonctionner dans WLS, est plus tellement à cause de la JTA. Je ne pense pas que le conducteur répondra aux appels SetqueryTimeout dans un contexte de transaction, mais je pourrais être incorrect.


Si votre valeur d'expiration de transaction est trop élevée, vous pouvez vérifier les délais d'attente définis dans le service JTA pour WLS, ainsi que dans la propriété Trans-Timeout-Seconds dans EJB-JAR-XML (pour CMTS) et UserTransAction.SetTransActionTimeOut () pour BMTS .


Il semble que SetquerytiMout fonctionne réellement dans le contexte JTA, mais pas toujours. Parfois, il est terminé la requête après 5 minutes (la valeur que j'ai définie dans la méthode), parfois après 20 minutes, parfois après 60 minutes.


La valeur du délai d'attente JTA n'était en réalité pas si élevée dans nos environnements et est égale à 30 secondes.


Oh bien, quand j'ai dit que cela ne devrait pas être invoqué pour des applications critiques de temps, je n'ai pas anticipé ce genre de comportement. À propos, Weblogic et la plupart des autres serveurs d'applications annuleront la transaction (synchronisant ainsi la requête) sur le délai de transaction, presque immédiatement. Vous voudrez peut-être vérifier s'il existe un bug lié à votre configuration actuelle ou si la charge sur le serveur d'applications ou la base de données est supérieure à celle prévue.



4
votes

Regardez les 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 maximum de processeur par requête.

Si vous avez des requêtes exécutées pendant plus de 2 minutes sur une base régulière, vous voudrez peut-être d'abord faire une certaine réglage de vos requêtes.


2 commentaires

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


Les profils de Oracle seront notre prochaine étape si la série SetQuyTimeout ne fonctionnera pas :).



1
votes

Selon http://www.javamonamour.org/2012/09/oraclenetConnectTimeout .html

oracle.net.read_timeout pour les versions JDBC <10.1.0.5 Oracle.JDBC.ReadtimeOut pour les versions JDBC> = 10.1.0.5

Donc, si vous utilisez une version de pilote JDBC 10.1.0.5 ou plus, alors oracle.jdbc.readtimeout est la propriété correcte.


0 commentaires

0
votes

Réglage Oracle.JDBC.Readtimeout a aidé à effectuer des appels JDBC. Je l'ai utilisé dans une application de démarrage de printemps de production en spécifiant des propriétés de DataSource comme ci-dessous

spring.datasource.hikari.connection-timeout=1000
spring.datasource.hikari.dataSourceProperties=oracle.jdbc.ReadTimeout=2000


0 commentaires