我必须closures()每个EntityManager?

我刚刚开始将我自己创build的持久性框架迁移到JPA。

鉴于持久性框架隐藏了很多pipe道,我有兴趣知道不closuresEntityManagers是否会创build资源泄漏,或者如果框架将为我收集和closures它们。

我打算在所有地方closures他们,但我必须?

目前使用TopLink,只是因为它可以轻松地与NetBeans一起工作,但很高兴能够调查其他JPA提供商。

这取决于你如何获得它。

如果使用EntityManagerFactory创build它,则无论使用什么框架,都必须closures它。

如果你使用dependency injection获得它(例如使用EJB和@PersistenceContext注释),你不应该手动closures它(AFAIK它会导致RuntimeException)。

你应该。

框架不知道你打算如何使用EM,所以他们不能closures它(除了,可能是,在最终确定,这是不能保证)。 是的,不closures它们会造成资源泄漏。

这个想法和“always close java.sql.Connection”一样(尽pipe一些数据源有设置来通过不活动来自动closures它们)或者“总是closuresHibernate会话”。

此外,如果您打算编写可移植代码,则不应该依赖特定的JPA提供程序“变得聪明” – 否则可能无法及时closuresEM。

我已经在我的仓库中使用@PersistenceContext批注获得了EntityManager 。 我可以看到,在连接maxPoolSize达到其maxPoolSize它不会被清理。

但是,如果我使用EntityManagerFactory创buildEntityManager并调用entitymanager.close()则连接正在清理。 我使用c3p0作为连接库。