Je viens de commencer à migrer mon framework de persistance local vers JPA.
Étant donné que les cadres de persistance masquent une grande partie de la plomberie, je souhaite savoir si NE PAS fermer EntityManagers créera une fuite de ressources, ou si les cadres vont les collecter et les fermer pour moi.
J'ai l'intention de les fermer partout, mais DOIS-JE le faire?
Pour le moment, j'utilise TopLink, simplement parce qu'il fonctionne facilement avec NetBeans, mais je suis heureux d'enquêter sur d'autres fournisseurs JPA.
Cela dépend de la façon dont vous l'avez obtenu.
Si vous l'avez créé à l'aide de EntityManagerFactory, vous devrez le fermer, quel que soit le framework que vous utilisez.
Si vous l'avez obtenu en utilisant l'injection de dépendances (par exemple en utilisant les annotations EJB et @PersistenceContext), vous ne devez pas le fermer à la main (AFAIK, cela provoquera RuntimeException).
Vous devriez.
Les cadres n'ont aucune idée de la façon dont vous envisagez d'utiliser l'EM, ils ne peuvent donc pas le fermer (sauf, peut-être, lors de la finalisation, ce qui n'est pas garanti). Oui, ne pas les fermer créerait une fuite de ressources.
L'idée est la même que "toujours fermer Java.sql.Connection" (malgré certaines sources de données ont des paramètres pour les fermer automatiquement par inactivité) ou "toujours fermer la session Hibernate".
En outre, si vous envisagez d'écrire du code portable, vous ne devez pas compter sur un fournisseur JPA "intelligent" - d'autres peuvent ne pas fermer l'EM à temps.
J'ai obtenu EntityManager
en utilisant l'annotation @PersistenceContext
Dans mon référentiel. Je peux voir qu'après que les pools de connexions ont atteint leur maxPoolSize
, ils ne sont pas nettoyés.
Cependant, si je crée EntityManager
en utilisant EntityManagerFactory
et que j'appelle entitymanager.close()
alors les connexions sont nettoyées. J'utilise c3p0
Comme bibliothèque de pool de connexion.