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

时间:2008-10-21 00:08:20

标签: java jpa persistence toplink

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

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

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

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

3 个答案:

答案 0 :(得分:76)

这取决于你如何获得它。

如果您使用EntityManagerFactory创建它,无论您使用什么框架,都必须关闭它。

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

答案 1 :(得分:11)

你应该。

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

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

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

答案 2 :(得分:4)

我在我的存储库中使用EntityManager注释获得了@PersistenceContext。我可以看到,在连接池到达maxPoolSize后,它不会被清除。

但是,如果我使用EntityManager创建EntityManagerFactory并调用entitymanager.close(),则会清除连接。我使用c3p0作为连接池库。