我是否必须关闭()每个EntityManager?

ste*_*mac 65 java persistence jpa toplink

我刚刚开始将我自己开发的持久性框架迁移到JPA.

鉴于持久性框架隐藏了大量的管道,我有兴趣知道是否关闭EntityManagers会造成资源泄漏,或者框架是否会收集并关闭它们.

我打算在所有地方关闭它们,但我必须这样做吗?

目前使用TopLink,只是因为它可以轻松地与NetBeans协同工作,但我很乐意调查其他JPA提供商.

jb.*_*jb. 78

这取决于你如何获得它.

如果您使用EntityManagerFactory创建它,则无论您使用何种框架,都必须关闭它.

如果使用依赖注入(例如使用EJB和@PersistenceContext注释)获取它,则不应手动关闭它(AFAIK会导致RuntimeException).

  • 在更广泛的意义上,EM仍应关闭.这只是EJB为您完成的工作,您可以通过遵守EJB要求来实现. (5认同)

Vla*_*hev 11

你应该.

框架不知道您打算如何使用EM,因此他们无法关闭它(除非,可能是在最终确定时,这是无法保证的).是的,不关闭它们会造成资源泄漏.

这个想法与"始终关闭java.sql.Connection"相同(尽管有些数据源具有通过不活动自动关闭它们的设置)或"始终关闭Hibernate会话".

此外,如果您打算编写可移植代码,则不应该依赖特定的JPA提供程序"聪明" - 其他可能无法及时关闭EM.


Pun*_*eet 5

我已经在我的存储库中EntityManager使用了@PersistenceContext注释。我可以看到在连接池到达它之后maxPoolSize它没有被清理。

但是,如果我创建EntityManagerusingEntityManagerFactory并调用,entitymanager.close()则连接将被清理。我正在c3p0用作连接池库。