为什么我们需要关闭finally块中的资源?在hibernate中谁负责关闭resourecs结果集,语句,连接?
答案 0 :(得分:0)
第一,请阅读此Why do I need to use finally to close resources?
在JDBC中,有几种资源理想情况下应该在使用后关闭。即使在Connection对象关闭时指定隐式关闭每个Statement和PreparedStatement,也不能保证何时(或如果)发生这种情况,特别是如果它与连接池一起使用时。您应该明确关闭Statement和PreparedStatement对象。 ResultSet对象也可能是一个问题,但是当相应的Statement / PreparedStatement对象关闭时,它们可以保证关闭,你通常可以忽略它。
在Hibernate中,显然内部实现负责创建和关闭资源。如果你想了解更多,你可以随时阅读Hibernate的源代码。
摘要:始终关闭PreparedStatement / Statement和Connection。在Java 7之前,建议关闭finally块中的资源,因为最终块总是在try块中执行而不管异常。但是,使用Java 7+,你可以使用try-with-resources惯用法来实现它。
答案 1 :(得分:0)
关闭声明的过程由org.hibernate.resource.jdbc.ResourceRegistry
处理。它的实现是org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl
。有一个方法release
接受一个Statement。首先,关闭所有ResultSet
个对象,然后最后关闭该语句。以下是其中的一些片段:
@Override
public void release(Statement statement) {
:
:
final Set<ResultSet> resultSets = xref.get( statement );
if ( resultSets != null ) {
closeAll( resultSets );
}
xref.remove( statement );
}
close( statement );
}
P.S:
依赖性信息
compile'org.hibernate:hibernate-core:5.2.2.Final'