当前位置: 首页 > 知识库问答 >
问题:

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

谷梁煌
2023-03-14

为什么我们需要关闭最终区块中的资源?在hibernate中,谁负责关闭Resources结果集、语句和连接?

共有2个答案

堵泽宇
2023-03-14

关闭语句的过程由org.hibernate.resource.jdbc.Resource注册表负责。它的实现是org.hibernate.resource.jdbc.internal.ResourceRegstryStandard ardImpl。有一个方法释放它接受一个语句。首先,关闭所有ResultSet对象,然后最终关闭语句。以下是其中的一些片段:

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

附笔:

>

  • 依赖信息

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

  • 巴洲
    2023-03-14

    首先,阅读本文,为什么我需要使用finally来关闭资源?

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

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

    总结:始终关闭PreparedStatement/Statement和Connection。在Java 7之前,建议关闭finally块中的资源,因为finally块始终执行,而不管try块中是否存在异常。然而,在Java 7中,您可以使用try with resources习惯用法使其自动发生。

     类似资料:
    • 我最近和我的教授讨论了如何处理基本的jdbc连接方案。假设我们要执行两个查询,这是他提出的 我不喜欢这种方法,对此我有两个问题: 1.A)我认为,如果在我们做“其他事情”的地方,或在或那么当方法结束时,s1就不会被关闭。我说得对吗? 1.B)教授一直要求我明确关闭结果集(即使声明文档明确表明它将关闭结果集),她说孙建议这样做。有什么理由这样做吗? 现在,我认为这是同样事情的正确代码: 2. A)此

    • 我知道Java中的安全模式是在finally块中按顺序关闭结果集、语句和连接。 若您关闭连接,然后尝试关闭语句(不引发异常)。但若您试图从语句中调用任何方法,则会引发异常。 我想知道关闭连接是否会自动关闭所有由该连接创建的语句对象? 更新:我正在使用DatabaseProductVersion:Oracle Database 11g Release 11.1.0.0.0驱动程序名称:Oracle

    • 问题内容: 尽管随后关闭了连接,是否必须分别关闭JDBC结果集和语句?据说在使用后关闭所有JDBC资源是一个好习惯。但是,如果我有以下代码,是否有必要关闭结果集和语句? 问题是连接的关闭是否可以完成任务,或者它是否使某些资源处于使用状态。 问题答案: 你所做的是完美且非常好的做法。 我说这是一个好的做法的原因……例如,如果由于某种原因你正在使用“原始”类型的数据库池并调用,则连接将返回到池中,并且

    • 问题内容: 我知道Java中的安全模式是在finally块中依次关闭ResultSet,Statement和Connection。 如果您关闭连接,然后尝试关闭语句(不抛出异常)。但是,如果您尝试从语句中调用任何方法,则会引发异常。 我想知道关闭连接是否会自动关闭从该连接创建的所有语句对象? 更新: 我正在使用DatabaseProductVersion:Oracle Database 11g版本

    • 我最近转到了一个项目,在这个项目中我遇到了很多这种性质的代码--(这是使用jdbc postgres驱动程序) 显然,这段代码已经在生产中运行了一段时间,没有引起问题。 为了进一步澄清,如果我的理解是正确的(即,statement和resultset必须在连接关闭之前而不是之后关闭),我需要在catch和finally之间重复一些代码。修订后的代码如下所示。这可以简化吗? 只是为了透视,这段代码是

    • 本文向大家介绍浅谈java7增强的try语句关闭资源,包括了浅谈java7增强的try语句关闭资源的使用技巧和注意事项,需要的朋友参考一下 java7增强的try语句关闭资源 传统的关闭资源方式 使用finally块来关闭物理资源,保证关闭操作总是会被执行。 关闭每个资源之前首先保证引用该资源的引用变量不为null。 为每一个物理资源使用单独的try...catch块来关闭资源,保证关闭资源时引发