Java 是否每个查询都需要关闭实体管理器?
我将在1年内使用JPA作为数据库框架用Java开发系统Java 是否每个查询都需要关闭实体管理器?,java,hibernate,jpa,Java,Hibernate,Jpa,我将在1年内使用JPA作为数据库框架用Java开发系统 每次我查询时,我都不会关闭EntityManager,我的理解是JPA在执行以下查询后会自动关闭EntityManager getSingleResult()或getResultList() 如果没有,垃圾收集是否将收集它以进行处置?应用程序管理的EntityManager(通过调用emf.createEntityManager()从EntityManager工厂获得的那些)必须显式关闭 编辑:您不必在每次查询后关闭EM,但请确保在从创建
每次我查询时,我都不会关闭EntityManager,我的理解是JPA在执行以下查询后会自动关闭EntityManager getSingleResult()或getResultList()
如果没有,垃圾收集是否将收集它以进行处置?应用程序管理的EntityManager(通过调用
emf.createEntityManager()
从EntityManager工厂获得的那些)必须显式关闭
编辑:您不必在每次查询后关闭EM,但请确保在从创建EM的方法返回之前关闭EM。一种常见的方法是将EM嵌入try/catch/finally
块中,调用EM.close()在finally
案例中的code>
如果您正在Java EE兼容容器中使用事务范围的EntityManager,则EntityManager由容器在事务期间创建,并在事务完成时关闭。因此,通过调用createEntityManager,EntityManager需要显式关闭。还有一个问题,使用事务范围的EntityManager是什么意思?使用JBoss或GlassFish等JavaEE容器时,事务范围的EntityManager是默认的。它们的优点是,您不必关心它们的生命周期——只需请求一个实例并使用它。很好地解释了这种差异。如果我们不关闭entityManager会有什么后果?在java ee应用程序中,是否有方法检测未关闭的实体管理器?未关闭的EM是一种资源泄漏。在具有事务范围EMs的EE应用程序中,实现保证关闭EMs,因此不需要检测未关闭的EMs。