2008-11-20 15 views
1

J'ai une servlet fonctionnant sur un serveur Oracle OCCAS. Actuellement, je mappe certaines données dans une base de données à une classe d'entité dans mon application en utilisant @Entity annotaion. Cependant, je ne parviens pas à injecter l'EntityManager (@PersistenceContext), et à ma connaissance c'est parce qu'il s'exécute dans mon contexte de servlet et non comme un EJB Entity séparé. La création du gestionnaire via EntityManagerFactory fonctionne, cependant, c'est ce que j'utilise pour le moment.Comment fermer EnityManager lorsqu'il n'est pas injecté?

Maintenant, après un certain nombre de redémarrages de l'application, je reçois une erreur d'espace PermGen. Je pense que c'est lié à la persistance en quelque sorte. Il y a un appel à EntityManager.close() dans ma méthode finalize, mais il n'apparaît jamais dans le journal.

Est-ce une mauvaise manière de faire les choses - suis-je "obligé" d'avoir un Entity Bean séparé, ou comment dois-je nettoyer l'EntityManager?

Répondre

1

J'ai eu un problème similaire et l'ai résolu en utilisant ThreadLocal et un filtre de servlet.

Here's a post on my blog detailing what you need to do; fondamentalement, votre filtre de servlet configure le gestionnaire d'entités et le ferme après la fin de l'appel de servlet; il rend le gestionnaire d'entités disponible en tant que variable locale de thread (selon la recommandation d'Hibernate). Vous devez également capturer des exceptions dans le filtre et effectuer une restauration.

BTW, finaliser n'est pas garanti d'être appelé comme vous le pensez. finalize doit être appelé avant que la machine JVM ne quitte, mais en dehors de cela, il peut être long.

+0

Merci! Je vais essayer, ou peut-être aller sur la route EJB. Après tout, il y a là un conteneur qui peut faire le travail. Je me suis dit qu'après un redéploiement, l'ancien objet de l'application devrait être prêt pour le nettoyage du GC - et surtout quand PermGen est faible. Tant pis... –