Question

Nous utilisons Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17. Nous avons déployé l'application sur un boîtier AIX. Le lendemain, quand j'entre, j'essaie de me connecter à l'application. Je reçois cette exception sur la page:

Erreur 500: le traitement de la demande a échoué; L'exception imbriquée est org.springframework.dao.DataAccessResourceFailureException: impossible d'exécuter la requête; L'exception imbriquée est org.hibernate.exception.JDBCConnectionException: impossible d'exécuter la requête

J'ai consulté les System.Out , ainsi que des détails supplémentaires. (Utilisé pastebin parce que le formatage du journal bousillait vraiment la mise en page.)

La ligne de notre code à l'origine de notre exception est la suivante:

List loginList = getHibernateTemplate().find("from Login  
    where storeId =" + id + " and password ='" + password + "'");

Nous câblons la connexion dans le fichier applicationContext.xml de Spring. Nous sommes conscients que la connexion sur l'AS400 est interrompue à certains moments (ils peuvent redémarrer le système du jour au lendemain - je ne suis pas sûr). Cependant, nous préférerions ne pas ouvrir une nouvelle connexion lorsque nous câblons tout dans l'applicationContext.

Ce problème ne se produit pas si vous utilisez un DataSource / JNDI ou JDBC

Quelqu'un connaît-il des paramètres à ajouter à Spring ou à Hibernate pour vérifier si la connexion devient obsolète et, le cas échéant, supprimez-la et créez-en une nouvelle? Ou d'autres idées pour résoudre ce problème? Faites-moi savoir si vous avez besoin de plus d'informations / de code.

Très apprécié,

Chris

Mise à jour:

J'ai vérifié certains messages sur les forums de la communauté de printemps et j'ai implémenté DataSource avec commons-dbcp, qui possède des propriétés telles que 'testWhileIdle' et 'validationQuery'. Je vais laisser l'application en marche et la vérifier à nouveau dans la matinée. Publiera une mise à jour sur les résultats.

Mise à jour n ° 2:

Utilisation de dbcp-commons BasicDataSource semble résoudre ce problème, qui semble être un problème de réseau. Websphere a mis en pool des connexions et s’il ya un problème de réseau du côté de l’AS400, il essaiera d’utiliser sa connexion, qu’elle ne connaît pas comme "obsolète". Utiliser une requête de validation avec un intervalle de temps est un moyen peu coûteux (mais efficace) de résoudre ce problème - mais il peut exister un meilleur moyen du côté de Websphere, sous configuration. Mais aussi bien ne pas changer ce qui n’est pas cassé, alors jusqu’à ce que cela échoue, ce sera probablement notre solution pour l’avenir.

Était-ce utile?

La solution

Ah, c'est ce que j'allais dire ... le problème doit être résolu dans le pool de connexions, en validant les connexions avant de les renvoyer. DBCP a validationQuery et JBoss a également quelque chose de similaire; Je suis sûr que Websphere doit avoir quelque chose de similaire dans son pool de connexions pour valider les connexions avant de les distribuer. Même si vous n'utilisez pas testWhileIdle, si la connexion est invalide, une nouvelle connexion est créée et vous est remise par le pool au lieu de celui qui est invalide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top