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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top