Soll ich oft EntityManager.clear () aufrufen, um Speicherlecks zu vermeiden?

8

Ich bin neu bei JPA / OpenJPA und habe festgestellt, dass wenn ich EntityManager.clear() nicht anrufe, nachdem ich Entitäten beibehalten habe, bekomme ich OutOfMemoryError (ich füge immer 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.

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

    
ecerulm 11.02.2010, 09:49
quelle

3 Antworten

6

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

    
Padmarag 11.02.2010, 10:01
quelle
5

Hängt davon ab, wie viele Objekte Sie in den Persistenzprozess einbringen (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 die JPA-Impl in den L1-Cache gestellt werden.

    
DataNucleus 11.02.2010 10:22
quelle
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 Bereichs.

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

    
Adeel Ansari 11.02.2010 10:51
quelle