在休眠中,谁负责关闭资源结果集、语句、连接?



为什么我们需要关闭 finally 块中的资源? 在休眠中,谁负责关闭资源结果集、语句、连接?

首先,请阅读此内容 为什么我需要使用 finally 来关闭资源?

在 JDBC 中,有几种资源理想情况下应在使用后关闭。 即使每个语句和 PreparedStatement 都指定为在关闭连接对象时隐式关闭,但无法保证何时(或如果(发生这种情况,尤其是当它与连接池一起使用时。您应该显式关闭语句和 PreparedStatement 对象以确保安全。ResultSet 对象也可能是一个问题,但由于当相应的 Statement/PreparedStatement 对象关闭时,它们肯定会被关闭,因此通常可以忽略它。

在Hibernate中,显然内部实现负责创建和关闭资源。如果你想了解更多,你可以随时阅读Hibernate的源代码。

摘要:始终关闭预准备语句/语句和连接。在 Java 7 之前,建议关闭 finally 块中的资源,因为无论 try block 中的异常如何,finally 块总是执行。但是,在 Java 7+ 中,您将使用"尝试资源"习惯用法来自动实现它。

关闭语句的过程由org.hibernate.resource.jdbc.ResourceRegistry负责。它的实现是org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl.有一个方法release它接受语句。首先,关闭所有ResultSet对象,然后关闭语句。以下是其中的一些片段:

@Override
public void release(Statement statement) {
:
:
final Set<ResultSet> resultSets = xref.get( statement );
if ( resultSets != null ) {
closeAll( resultSets );
}
xref.remove( statement );
}
close( statement );
}

附言:

  1. 依赖关系信息

    编译 'org.hibernate:hibernate-core:5.2.2.Final'

最新更新