我必须关闭每个EntityManager吗?


70

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

鉴于持久性框架隐藏了很多问题,我想知道是否不关闭EntityManagers会造成资源泄漏,或者框架是否会为我收集并关闭它们。

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

目前使用TopLink只是因为它可以轻松地与NetBeans一起使用,但是很高兴研究其他JPA提供程序。


Answers:


86

这取决于您如何获得它。

如果使用EntityManagerFactory创建它,则无论使用哪种框架,都必须将其关闭。

如果使用依赖注入(例如,使用EJB和@PersistenceContext批注)获得了它,则不应该手动关闭它(AFAIK会导致RuntimeException)。


6
从广义上讲,EM仍应关闭。EJB只是为您完成了这项工作,并且您通过遵守EJB要求使之成为可能。
弗拉基米尔·朱热夫(Fladimir Dyuzhev)

12

你应该。

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

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

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


5

我已经在资源库中EntityManager使用@PersistenceContext注释。我可以看到,在连接池到达它之后,maxPoolSize它不会被清理。

但是,如果我EntityManager使用usingEntityManagerFactory和call创建,entitymanager.close()则连接将被清理。我正在c3p0用作connectionpool库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.