2008-10-21 96 views
61

我刚刚开始将我自己创建的持久性框架迁移到JPA。是否必须关闭()每个EntityManager?

鉴于持久性框架隐藏了很多管道,我有兴趣知道是否关闭EntityManagers将创建资源泄漏,或者如果框架将为我收集并关闭它们。

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

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

+1

另请参见[应该关闭JPA实体管理器吗?](http://stackoverflow.com/q/10762974/697630) – 2013-08-12 12:41:53

回答

71

这取决于你如何获得它。

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

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

+5

从更广泛的意义上讲,EM仍应该关闭。这只是EJB的工作,您可以通过遵守EJB要求来实现。 – 2008-10-21 10:39:56

10

你应该。

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

这个想法和“always close java.sql.Connection”一样(尽管一些数据源有设置来通过不活动自动关闭它们)或者“总是关闭Hibernate会话”。另外,如果您打算编写可移植代码,则不应该依赖特定的JPA提供者“变得聪明” - 其他人可能无法及时关闭EM。

2

我已经在我的资料库中使用@PersistenceContext注解获得了EntityManager。我可以看到,在连接池达到其maxPoolSize后,它不会被清理干净。

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

相关问题