cocoon-users-fr mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sevigny <sevi...@ajlsm.com>
Subject Pool / datasource JDBC : remplissage en cas de connexions defaillantes
Date Tue, 12 Sep 2006 06:01:50 GMT
Bonjour,

Nous sommes confrontés à un problème embêtant. Il nous semble difficile 
à croire qu'il n'y a pas une solution simple, mais nous ne l'avons pas 
trouvé.

Pour informations, cela concerne Cocoon 2.1.5.1, s'il s'agit de quelque 
chose qui a été amélioré ou corrigé dans une version ultérieure, nous 
sommes curieux de savoir quelle version et où.

Nous avons une "datasource" JDBC définie dans le cocoon.xconf, 
schématiquement comme ceci:

<jdbc name="mysql">
   <pool-controller max="10" min="5"/>
   <dburl>{URL de connexion distante à une base Oracle}</dburl>
   <user>{code utilisateur}</user>
   <password>{mot de passe}</password>
</jdbc>

En temps normal, ça marche parfaitement bien. Nous l'utilisons à 
différents endroits dans l'application sans aucun souci.

Toutefois, si jamais la base de données n'est pas accessible, pour une 
raison ou une autre (réseau défaillant, opérations de maintenance, 
etc.), voici ce qui se passe.

Une demande de connexion retourne une exception, ce qui est logique. 
Nous pouvons intercepter cette exception et la traiter si nécessaire. 
Toutefois, le pool de connexions se remplit et ne se vide jamais.

Par exemple, si la base de données n'est pas accessible, si je demande 
10 fois une connexion, j'aurai 10 fois l'exception. La 11è fois et les 
suivantes, j'aurai une attente interminable, la méthode "getConnection" 
n'aboutit jamais. On peut vérifier à ce moment que le pool est plein.

La seule solution que nous avons trouvée pour l'instant est de 
redémarrer l'application, ce qui n'est pas très élégant.

En complément, nous avons vérifié que:

- une connexion à MySQL (au lieu d'Oracle) ne change rien
- le type de défaillance (serveur inaccessible, identification manquée, 
etc.) ne change rien
- on peut mettre blocking="false", dans ce cas on n'a pas l'attente, 
mais le pool continue à se remplir et ne se videra jamais, ce qui n'est 
pas une solution non plus
- notre propre code ne semble pas en jeu, car si on texte avec une toute 
petite XSP ne contenant que du code ESQL, on a le même comportement

Nous sommes donc à la recherche d'une solution de type:

- configurer la source de données ou le pool de manière à ce qu'une 
défaillance de connexion ne remplisse pas le pool
- méthode pour vider le pool de manière ponctuelle (par exemple si on 
intercepte une exception lors de getConnection()
- modification du code source (Excalibur? Cocoon?) pour corriger ce 
comportement

Les applications Cocoon qui utilisent un tel pool ne sont pas rares, et 
une base de données inacessible n'est pas que théorique... donc il doit 
bien y avoir une solution?

Merci et à bientôt,

Martin Sévigny

---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:users-fr-unsubscribe@cocoon.apache.org
Autres commandes : mailto:users-fr-help@cocoon.apache.org


Mime
View raw message