gpt4 book ai didi

java - 在这种情况下应该使用 try-finally

转载 作者:行者123 更新时间:2023-12-05 08:19:04 25 4
gpt4 key购买 nike

在 DAO 层类中,假设我有如下代码:

private EntityManagerFactory factory;

public void update(T entity) {
EntityManager entityManager = factory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(entity);
entityManager.getTransaction().commit();
entityManager.close();
}

现在在上面的代码块中,RuntimeExceptions 可能(很少)在调用 entityManager.close() 之前发生。那么,这样写好不好:

public void update(T entity) {
EntityManager entityManager = factory.createEntityManager();
try {
entityManager.getTransaction().begin();
entityManager.merge(entity);
entityManager.getTransaction().commit();
}
finally {
entityManager.close();
}
}

由于我方法中的所有对象都是本地的,一旦方法结束,它们将不存在。那么,当方法内部发生异常时,这个方法的栈会发生什么变化呢?

我认为如果在异常情况下堆栈存在,那么我确实需要 finally block 来关闭 entityManager。实际发生了什么?

最佳答案

Since all the objects in my method are local, they will not exist once the method is over.

不,对对象的引用是本地的,并在方法作用域完成时被删除,对象本身驻留在堆上,最终可能会被垃圾收集。为了安全起见,我会在 finally 语句中添加对 close() 的调用。

查看 Hibernate 4.2.15 的 EntityManager.close() 实现(我们还不能/不使用 Hibernate 4.3+,但我猜它看起来很相似),关闭被传递给 session ,事务协调器和 - 如果启用 - 统计收集器。所有这些类都会自己做一些清理工作,比如清除一级缓存、关闭数据库连接、收集 session 统计信息等。

关于java - 在这种情况下应该使用 try-finally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com