我必须关闭()每个EntityManager吗



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

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

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

目前使用TopLink,只是因为它很容易与NetBeans配合使用,但我很乐意调查其他JPA提供商。

这取决于您是如何获得的。

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

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

您应该这样做。

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

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

此外,如果您计划编写可移植代码,您不应该依赖特定的JPA提供商"聪明"——其他提供商可能无法及时关闭EM。

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

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

Justo要给我5美分,你必须记得关闭你的EntityManagerFactory。我只是用它来创建我的EntityManager,它每次都打开并保持打开一个新的连接池。

相关内容

  • 没有找到相关文章

最新更新