2010-02-11 4 views
8

Ich bin neu zu JPA/OpenJPA und ich bemerkte, dass, wenn ich EntityManager.clear() nicht aufrufen, nachdem ich Entitäten persistentes bekomme ich eine OutOfMemoryError (ich füge neue Entitäten in einer Schleife hinzu). Ich bin mir nicht sicher, ob dies das erwartete Verhalten ist, oder es ist einfach und OpenJPA 1.2.1 Glitch.Soll ich EntityManager.clear() oft aufrufen, um Speicherlecks zu vermeiden?

Muss ich also die Entitäten explizit trennen? Wenn ich nicht bin, ist es trotzdem eine gute Übung?

Antwort

6

Ich habe nicht viel Erfahrung mit JPA. Dies ist jedoch nützlich -
In JPA müssen Sie entweder:
- Erstellen Sie einen neuen EntityManager für jede Transaktion.
- Rufen Sie nach jeder Transaktion clear() auf, um den Persistenzkontext zu löschen.

+0

Danke. OK, mit den Hinweisen in den Antworten habe ich herausgefunden, dass ich nicht nur einen langlebigen EntityManager in der Anwendung verwenden soll. Ich sollte Method Scope oder Request Scope [1] verwenden. Das würde den Aufruf von em.clear() unnötig machen. Vielen Dank! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm

+0

Nützlicher Link. Ich hatte JPA mit Dependency Injection (mit Seam) verwendet, also hatte ich kein ähnliches Problem. – Padmarag

5

Hängt davon ab, wie viele Objekte Sie in den Persistenzprozess bringen (lesen). Wenn Sie mit großen Zahlen umgehen (oder einige der Objekte sind groß), kann die Verwendung von clear() sinnvoll sein. Jedes Mal, wenn ein Objekt gelesen wird, sollte es durch das JPA-Impl in den L1-Cache gestellt werden.

3

Es hört sich an, als wäre irgendwo in Ihrem Design etwas nicht in Ordnung. In der Regel wird die Entität getrennt, sobald sie außerhalb des Bereichs des Entity Manager liegt. Und das ist einer der Gründe, warum Sie Beziehungen nicht lazy laden können, außerhalb des Geltungsbereichs.

Soweit meine Erfahrung betrifft, habe ich selten em.clear() verwendet, wenn überhaupt. Ich habe die Hibernate-Implementierung und Toplink Essentials verwendet. Keine Erfahrung mit OpenJPA, noch nicht.

+0

Wenn Sie sagen, dass die Entität losgelöst wird, liegt sie außerhalb des Bereichs von Entity Manager. Meinst du, dass ich den EntityManager schließen und für jede Transaktion eine neue erstellen sollte, wie es Padmarag vorschlägt? – ecerulm

Verwandte Themen