66 votes

Dois-je fermer() à chaque EntityManager?

Je viens de commencer la migration de ma maison persistance cadre de JPA.

Étant donné que la persistance des cadres de cacher un lot de la plomberie, je suis intéressé à savoir si la NON fermeture de EntityManagers permettra de créer une fuite de ressources, ou si les cadres de collecter et de les fermer pour moi.

J'ai l'intention dans tous les lieux de les fermer, mais dois-je?

À l'heure actuelle avec TopLink, juste parce qu'il travaille avec NetBeans facilement, mais je suis heureux d'enquêter sur d'autres JPA fournisseurs.

80voto

jb. Points 4932

Cela dépend de comment vous l'avez obtenu.

Si vous avez créé à l'aide de EntityManagerFactory vous devrez fermer n'importe quel cadre vous utilisez.

Si vous avez obtenu à l'aide de l'injection de dépendance (par exemple, en utilisant EJB et @PersistenceContext annotation) vous ne devez pas fermer à la main (autant que je sache, il sera la cause de RuntimeException).

12voto

Vladimir Dyuzhev Points 10647

Vous devriez le faire.

Les cadres n'ont aucune idée de comment vous avez l'intention d'utiliser l'EM, de sorte qu'ils ne peuvent pas la fermer (à l'exception, peut-être, sur la version finale, ce qui n'est pas garanti). Oui, ne pas les fermer, serait de créer une fuite de ressources.

L'idée est la même que "toujours proche de java.sql.Connexion" (en dépit de certaines sources de données ont des paramètres de les fermer automatiquement par l'inactivité) ou "fermez toujours la session Hibernate".

En outre, si vous envisagez d'écrire du code portable, vous ne devriez pas compter sur des fournisseur JPA "smart" -, d'autres peuvent ne pas fermer l'EM dans le temps.

5voto

Puneet Points 25

J'ai obtenu EntityManager l'aide @PersistenceContext d'annotation dans mon référentiel. Je peux voir qu'après le connectionpools atteint son maxPoolSize il n'est pas nettoyé.

Cependant, si je crée EntityManager l'aide EntityManagerFactory et appelez - entitymanager.close() puis les connexions sont de se laver. Je suis l'aide d' c3p0 comme connectionpool de la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X