2010-02-11 20 views
8

Sono nuovo di JPA/OpenJPA e ho notato che se non chiamo EntityManager.clear() dopo la persistenza delle entità ottengo un OutOfMemoryError (continuo ad aggiungere nuove entità in un ciclo). Non sono sicuro se questo è il comportamento previsto o è solo e OpenJPA 1.2.1 glitch.Devo chiamare EntityManager.clear() spesso per evitare perdite di memoria?

Quindi, sono obbligato a separare esplicitamente le entità da solo? Se non lo sono, è comunque una buona pratica?

risposta

6

Non ho molta esperienza con JPA. Tuttavia questo sarà utile -
In JPA è necessario:
- Creare un nuovo EntityManager per ciascuna transazione.
- Chiama clear() dopo ogni transazione per cancellare il contesto di persistenza.

+0

Grazie. ok, con i suggerimenti nelle risposte ho capito che non dovrei usare solo un EntityManager longevo nell'applicazione. Dovrei usare l'ambito del metodo o richiedere l'ambito [1]. Ciò eliminerebbe la necessità di chiamare em.clear(). Grazie! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm

+0

Link utile. Avevo usato JPA con Dependency Injection (usando Seam), quindi non avevo affrontato problemi simili. – Padmarag

5

Dipende dal numero di oggetti inseriti nel processo di persistenza (leggi). Se gestisci numeri grandi (o alcuni oggetti sono grandi) allora l'uso di clear() può avere senso. Ogni volta che viene letto un oggetto, deve essere inserito nella cache L1 dall'imp di JPA.

3

Sembra che ci sia qualcosa che non va da qualche parte, nel tuo progetto. Di solito, l'entità viene rimossa quando non rientra nell'ambito del gestore entità. E questo è uno dei motivi per cui non si riescono a snellire le relazioni, al di fuori dell'ambito.

Per quanto riguarda la mia esperienza, ho usato raramente em.clear(), se mai. Ho usato l'implementazione di Hibernate e Toplink Essentials. Nessuna esperienza con OpenJPA, ancora.

+0

quando si dice che l'entità viene rimossa una parte è al di fuori dell'ambito del gestore entità, si intende che dovrei chiudere EntityManager e crearne uno nuovo per ogni transazione, come suggerisce Padmarag? – ecerulm

Problemi correlati