Est-il possible d'avoir la connexion de JBoss piscine reconnecter à Oracle lorsque les connexions vont mal?
Nous avons notre JBoss et Oracle sur des serveurs distincts. Les connexions semblent être baissé et est à l'origine de problèmes avec JBoss. Comment puis-je avoir le JBoss reconnecter à l'Oracle si la connexion est mauvaise alors que l'on à comprendre pourquoi les connexions sont déposés en premier lieu?
Vous devez vous connecter pour publier un commentaire.
Il est généralement une option de configuration de la piscine pour permettre une validation de la requête à exécuter sur les emprunter. Si la validation de la requête s'exécute correctement, la piscine sera de retour cet égard. Si la requête n'est pas exécutée correctement, la piscine va créer une nouvelle connexion.
La Wiki De JBoss documents divers attributs de la piscine.
Semble que cela devrait faire l'affaire.
Alors que vous pouvez utiliser la vieille "select 1 from dual" truc, l'inconvénient de ceci est qu'il émet une requête supplémentaire chaque fois que vous empruntez une connexion à partir de la piscine. Pour les gros volumes, ce est un gaspillage.
JBoss offre une connexion spéciale du programme de validation qui doit être utilisé pour Oracle:
Cela rend l'utilisation de la propriété ping() la méthode sur l'Oracle JDBC de la classe de Connexion, et utilise le pilote du réseau sous-jacent du code pour déterminer si la connexion est toujours en vie.
Cependant, il est toujours une perte de temps de faire cela chaque et chaque fois qu'une connexion est emprunté, de sorte que vous pouvez utiliser les installations où un thread d'arrière-plan vérifie les connexions dans le pool, et rejette les morts. C'est beaucoup plus efficace, mais signifie que si les connexions ne aller morte, toute tentative de les utiliser avant de le thread d'arrière-plan s'exécute sa vérification échoue.
Voir le wiki docs pour savoir comment configurer la vérification des antécédents (cherchez
background-validation-millis
).OracleValidConnectionChecker
avait un de bugs mineurs dans JBoss as, 4 et 5. Je me souviens aussi qu'il avait des problèmes de performances sous la lourde simultanée de la charge due à l'utilisation de distinct pinger fil sous le capot.pingDatabase()
va interroger la base de données avecSELECT 'x' FROM DUAL;
Pas assez de rep pour un commentaire, il est dans une forme de réponse. Le
'Select 1 from dual'
et skaffman deorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
méthode sont équivalents , bien que la vérification de la connexion fournit un niveau d'abstraction. Nous avons eu de décompiler l'oracle jdbc pour un dépannage d'exercice et de l'Oracle de la mise en œuvre interne de la commande ping pour effectuer une'Select 'x' from dual'
. Natch.JBoss offre 2 façons de Valider la connexion:
- Ping base ET
- Requête basée
Vous pouvez utiliser selon l'exigence. C'est prévu par le thread séparé que par la durée définie dans la source de données fichier de configuration.
Un certain temps si vous n'êtes pas avoir à droite du pilote oracle à Jboss, vous pouvez obtenir classcast ou d'erreur lié et pour cette connexion peut commencer d'abandon de pool de connexions. Vous pouvez essayer de créer votre propre ConnectionValidator classe par la mise en œuvre de
org.jboss.resource.adapter.jdbc.ValidConnectionChecker
interface. Cette interface permet à une seule méthode 'isValidConnection()
"et s'attendre à "NULL" en retour pour de connexion valide.Ex:
Récemment, nous avons eu quelques flottante de traitement de la demande les défaillances causées par des orphelins oracle
DBMS_LOCK
session verrous conservés indéfiniment dans le côté client de la connexion de la piscine.Voici donc une solution que les forces d'expiration de session, dans les 30 minutes, mais n'affecte pas l'application de l'opération:
Cela peut impliquer une certaine lenteur dans le processus d'obtention de connexions à partir de la piscine. Assurez-vous de tester la présente sous charge.
Une petite mise à jour pour @skaffman de réponse. Dans JBoss 7, vous devez utiliser le "nom de classe" de l'attribut lors de la configuration de connexion valide checker et aussi paquet est différent:
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />