2010-09-09 31 views
0

J'utilise le thread local pour gérer mes sessions de mise en veille prolongée. Récemment, j'ai vu des exceptions OutOfMemory sur mon serveur de production. J'ai couru Eclipse MAT sur le heap_dump et j'ai vu que beaucoup de mes sessions ne sont pas récupérées, même si elles sont fermées parce qu'elles sont référencées par l'objet ThreadWithAttributes de tomcatse. Cela me rend fou en ce moment j'ai vu beaucoup de messages avec des questions similaires sur différents forums, mais pas de réponses. Toute aide sera grandement appréciée.Référence Threadlocal pour implémenter la session hibernate, provoquant la session impl à ne pas récupérer le garbage

Merci

Répondre

0

Si votre utilisez les sessions Hibernate dans une application Web, NE PAS laisser les objets de session dans ThreadLocal y restent dans les demandes - puisque vous avez aucun contrôle sur les fils de toute façon, ils appartiennent au conteneur.

Si vous devez créer et fermer une session pour la durée d'une requête Web et que vous ne voulez pas passer l'objet Session partout, vous devriez envisager d'écrire un ServletFilter pour gérer le nettoyage - il sera appelé autour de chaque demande. Vous pouvez également laisser ce filtre valider ou annuler toutes les transactions que vous avez démarrées.

Vous devriez lire cette page pour une recette simple à la façon de le faire: http://community.jboss.org/wiki/OpenSessioninView

0

merci pour votre réponse. J'utilise actuellement open session in view, en utilisant getCurrentSession() ce qui signifie que la session est par requête et se ferme sur transaction.commit(). Je peux voir que les sessions sont fermées (mais pas annulées) mais la classe tomcat ThreadWithAttributes contient une référence à sessionImpl qui empêche la collecte des ordures. Cela arrive avec chaque thread. Ma base de données est assez volumineuse, ce qui cause des erreurs de mémoire après quelques heures ou un jour au maximum et le serveur doit être rebondi.