Question

J'ai un servlet s'exécutant sur un serveur Oracle OCCAS. Actuellement, je mappe certaines données d'une base de données sur une classe d'entités de mon application à l'aide de @Entity annotaion. Cependant, je ne parviens pas à injecter 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 toutefois, c’est ce que j’utilise actuellement.

Maintenant, après un certain nombre de redémarrages de l’application, une erreur d’espace vient de sortir de PermGen. Je suppose que cela est lié à la persistance d'une manière ou d'une autre. Il y a un appel à EntityManager.close () dans ma méthode de finalisation, mais il n'apparaît jamais dans le journal.

Est-ce une mauvaise façon de faire les choses? Suis-je "requis"? avoir un bean Entity distinct, ou comment suis-je censé nettoyer EntityManager?

Était-ce utile?

La solution

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

Voici un article sur mon blog détaillant ce que vous devez faire ; En gros, votre filtre de servlet configure le gestionnaire d'entités, puis le ferme à la fin de l'appel de servlet. il rend le gestionnaire d'entités disponible en tant que variable locale de thread (selon les recommandations de hibernate). Vous devez également intercepter les exceptions dans le filtre et effectuer une restauration.

BTW, finaliser n'est pas garanti d'être appelé comme vous le pensez. finalize devrait être appelé avant la fermeture de la machine virtuelle Java, mais en dehors de cela, le délai pourrait être long.

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