Bonjour,
j'utilise le connection pool de tomcat et les threadLocal de cette manière :
1) début de traitement de la requête dans la servlet: récupération d'une connexion du pool pour la mettre dans un ThreadLocal utilisé par la DAO
2) traitement de la requête
3) fermeture de la requête dans la servlet par un finally encadrant le traitement de la requête : appel de "connection.close()" et vidage du threadLocal (pour éviter d'éventuels fuites de mémoires)
Corriger moi si je me trompe :
une requête traitée par tomcat correspond à un thread (autrement dit, 2 requêtes HTTP = 2 threads distincs) : le fait d'utiliser un threadLocal, me permet donc d'attribuer une connexion du pool par thread
=> lorsque je demande la fermeture de la connexion, qui est donc lié au thread par l'instance de ThreadLocal, celle-ci retourne au pool et le thread d'exécution de tomcat est détruit (ou peut être en mis en idle).
Le problème est le suivant : lorsque deux requêtes AJAX successives font appels à ma servlet, il se trouve que aléatoirement, le traitement de l'une de ces requêtes échouent car la connexion à la base de données est perdue ("connection closed"), bien que la ressource jdbc soit bien configurée (validationOnQuery, testOnBorrow actifs).
Il y a ce lien de la documentation de tomcat, qui parle d'un problème similaire :
http://tomcat.apache.org/tomcat-7.0-...sed_Exceptions
Je cite :
"These can occur when one request gets a db connection from the connection pool and closes it twice. When using a connection pool, closing the connection just returns it to the pool for reuse by another request, it doesn't close the connection. And Tomcat uses multiple threads to handle concurrent requests"
Donc mon code, je me suis assuré que je ferme une seule et une unique fois ma connexion (en l'occurence à la fin du traitement de la requête par la servlet, sachant que j'ai même déplacé le traitement sur l'événement de destruction de la requête Http par un listener).
Mon hypothèse est donc la suivante : est-t'il possible que le pool de tomcat renvoie la même connexion lorsque 2 threads tomcat y font appel?
Comment puis-je résoudre ou contourner ce problème ? (mise à part en désactivant la clôture de la connexion à la fin du traitement de la requête => dans ce cas, tomcat s'occupe lui même de les clôturer par la configuration "removeAbandonned", mais je ne pense pas que ce soit une bonne chose)
Merci d'avance pour vos avis
Partager