2009-10-15 4 views
3

J'ai une application Web Java qui se connecte à une base de données Oracle exécutée sur une autre machine (je ne sais pas si cela est pertinent ou non). J'utilise DBCP pour la mise en commun des connexions. L'application Web est en cours d'exécution dans JBoss 4.2.2 et nous définissons notre source de données comme un bean au printemps.Dépassement du délai d'inactivité maximal dans l'application Web Java avec Oracle DB

Nous utilisons Hibernate pour ORM.

Nous recevons des erreurs de temps en temps comme suit: "ORA-02396: dépassé le temps d'inactivité maximum, veuillez vous reconnecter".

J'ai essayé d'ajouter des propriétés à notre DBCP BasicDataSource appelées "removeAbandoned" (true) et "removeAbandondedTimeout" (120) en vain.

Toute aide serait appréciée. Si je dois fournir plus d'informations, faites le moi savoir - je ne connais pas très bien le fonctionnement interne de la connexion, etc ...

Répondre

7

Essayez de définir la propriété testWhileIdle sur true lors de la configuration de votre source de données. Vous aurez également besoin d'une requête de test - pour Oracle, quelque chose comme select 1 from dual suffira.

Cela incitera dbcp à déplacer les connexions inutilisées pour les garder à l'état frais.

Vous pouvez également envisager d'exclure les connexions qui deviennent inactives si cela ne vous dérange pas de les recréer lorsqu'elles sont nécessaires ultérieurement. Regardez le documentation décrivant les options de configuration pour les propriétés minEvictableIdleTimeMillis, timeBetweenEvictionRunsMillis et maxIdle/minIdle.

0

Voir ce fil sur le spring forums.

Les utilisateurs soit fini par passer à c3p0 ou en ajoutant le testWhileIdle propriété à la configuration du ressort:

<prop key="hibernate.dbcp.testWhileIdle">true</prop> 

<prop key="hibernate.dbcp.validationQuery"> 
select 1 from dual 
</prop> 
+1

est peut-être utile de rappeler les affiches du forum de printemps - c'est la requête de validation potentiellement dangereux. Vous ne voulez pas l'exécuter s'il y a beaucoup de lignes dans abc. – serg10

0

je passer à la bibliothèque de la piscine de connexion Oracle Universal. Il est optimisé pour Oracle JDBC Connections, mais fonctionnera également avec n'importe quel pilote JDBC si vous changez de système. Il est également compatible avec JDBC 4.0 et est en cours de traitement. C3P0, Proxool, DBCP sont tous en quelque sorte stagnante. Il va valider votre connexion en faisant un ping vers Oracle plutôt qu'une requête, ce qui est beaucoup plus rapide.

Oracle UCP

+0

L'UCP est-il disponible pour 10g? – Rintoul

+0

Oui, cela fonctionne pour toute base de données qui a une implémentation de pilote JDBC valide. Juste a quelques astuces spéciales qu'il utilise si vous utilisez un pilote Oracle. – Gandalf