Wie EntityManager zu schließen, wenn nicht gespritzt?
Frage
Ich habe ein Servlet in einem Oracle-OCCAS Server ausgeführt wird. Derzeit ich in meiner Anwendung, einige Daten in einer Datenbank in eine Objektklasse zuordnen @Entity annotaion verwenden. Ich kann nicht die EntityManager (@PersistenceContext) aber, und zu meinem Verständnis injizieren, das ist, weil es in meinem Servlet-Kontext ausgeführt wird und nicht als separate Einheit EJB. Erstellen der Manager durch die EntityManagerFactory funktioniert, obwohl, so dass das, was ich im Moment verwenden.
Jetzt, nach einer Reihe von Neustarts der Anwendung, erhalte ich einen aus PermGen Raumfehler. Ich stelle dar, das irgendwie auf die Persistenz in Beziehung steht. Es ist ein Aufruf an EntityManager.close () in meiner Finalisierung Methode, aber es zeigt nie im Protokoll auf.
Ist das ein schlechter Weg, Dinge zu tun - bin ich „erforderlich“ eine separate Entity Bean haben, oder wie soll ich die EntityManager aufzuräumen
Lösung
Ich hatte ein ähnliches Problem und löste es Thread und einen Servlet-Filter verwendet wird.
Hier ist ein Beitrag auf meinem Blog detailliert, was Sie tun müssen; im Grunde Ihr Servlet-Filter setzt das Unternehmen Manager und schließt es dann nach dem Servlet-Aufruf abgeschlossen ist; es macht das Unternehmen Manager als Thread lokale Variable verfügbar (pro Empfehlung des Hibernate). Sie müssen auch Ausnahmen im Filter fangen und ein Rollback zu tun.
BTW, finalisieren ist garantiert nicht in der Art und Weise aufgerufen werden, die Sie denken. finalize
sollte , bevor die JVM-Exits aufgerufen werden, aber außerhalb davon, könnte es eine lange Zeit sein.