Suis-je censé appeler l'EntityManager.clear() souvent, pour éviter les fuites de mémoire?
Je suis nouveau sur JPA/OpenJPA et j'ai remarqué que si je ne l'appelez pas EntityManager.clear()
après je persiste entités-je obtenir une OutOfMemoryError
(je continuer à ajouter de nouvelles entités dans une boucle). Je ne sais pas si c'est le comportement attendu ou c'est juste et OpenJPA 1.2.1 glitch.
Donc, suis-je obligé explicitement détacher les entités moi-même?
Si je ne suis pas, c'est une bonne pratique de toute façon?
OriginalL'auteur ecerulm | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas beaucoup d'expérience avec JPA. Cependant, ce sera utile -
En JPA, vous devez soit:
- Créer un nouveau EntityManager pour chaque transaction.
- Appel clear() après chaque opération pour effacer le contexte de persistance.
Lien utile. J'avais utilisé JPA avec l'Injection de Dépendance (à l'aide de la Couture), donc n'avait pas été logés à la même question.
Ceci est incorrect, vous n'êtes pas censé effacer les em à chaque transaction. Vous ne prenez pas avantage de l'em si vous faites cela à chaque fois.
OriginalL'auteur Padmarag
Dépend de la façon dont beaucoup d'objets que vous apportez dans la persistance du processus (lire). Si vous manipulez des grands nombres (ou de certains objets volumineux), puis l'utilisation de clear() permet de donner un sens. Chaque fois qu'un objet est en lecture, il doit être placé dans le cache L1 par la JPA impl.
OriginalL'auteur DataNucleus
Il semble comme il ya quelque chose de mal, quelque part, dans votre conception. Généralement, l'entité est détaché une fois qu'il est en dehors de la portée de l'entité gestionnaire. Et c'est une des raison pour laquelle vous ne pouvez pas paresseux charge des relations, en dehors de la portée.
Aussi loin que mes expériences, j'ai très rarement utilisé em.clear(), si jamais. J'ai utilisé Hibernate mise en œuvre, et Toplink Essentials. Pas d'expérience avec OpenJPA, encore.
OriginalL'auteur Adeel Ansari