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

在指向另一个PreparedStatement之前,是否有必要关闭一个PreparedStatement?[副本]

单于骁
2023-03-14

我知道这里有人问了一个非常类似的问题:是否有必要在准备另一份声明之前关闭PreparedStatement,但即使在看了答案之后,我仍然感到困惑。

如果说,我将OP的代码修改为:

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet r = null;
try{
    conn = db.getConnection();
    pstmt = conn.prepareStatement(firstsql);
    r = pstmt.executeQuery();
    // do something with the ResultSet
    r.close();       // do I need this line?
    pstmt.close();   // do I need this line?
    PreparedStatement pstmt = conn.prepareStatement(secondsql);
    ResultSet r = pstmt.executeQuery();
    // do something with the ResultSet again
}
finally{
    if(r!=null)
        r.close();
    if(pstmt!=null)
        pstmt.close();
    if(conn!=null)
        conn.close();

我需要这两行吗?我知道r和pstmt都不可避免地要关闭(无论是否会出现运行时错误),因为它们位于finally块中,但r和pstmt都是指针。

贯穿这段代码的指针指向许多不同的PreparedStatement和ResultSet对象。在指向其他对象之前,我不需要关闭这些对象吗?

在我看来,如果这段代码缺少这两行,它只会确保r和pstmt指向的最后两个对象将被关闭。

共有1个答案

籍英叡
2023-03-14

首先,请注意,这段代码不会编译,因为您正在声明新变量pstmt和r,而这些变量仍在范围内可用。

如果没有,在为它们分配新值之前,您肯定应该关闭pstmt和r。通过为这些变量分配新值,实际上会丢失对以前值的引用,并且无法关闭它们,从而导致资源泄漏。

作为补充,请注意,此类类通常有其方法调用finalize,因此垃圾收集器迟早会将其关闭,但您永远不应该依赖于此行为。

 类似资料:
  • 问题内容: 我有一个网站,它的点击率很高,我遇到了问题,JDCB连接错误。 我对关闭有点困惑,我需要关闭还是仅关闭就足够了。 另外,我需要关闭它吗? 问题答案: 是的,您必须关闭PreparedStatement和结果集,因为它们可能导致内存泄漏。有关更多信息,请访问 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

  • 问题内容: 在JDBC中使用时,我应该关闭第一个还是第一个?我只是看到一个代码示例,其中先关闭,但是在我看来,先关闭更合乎逻辑。 有没有一种标准的,可以接受的方式来做到这一点?有关系吗?因为和对象直接相关,所以关闭还会导致也会被关闭吗? 问题答案: 该声明。我希望你能关闭(按顺序) 结果集 该声明 连接 (并在此过程中检查是否为空!) 即以与打开顺序 相反的 顺序关闭。 如果您使用Spring J

  • 问题内容: 如果我在finally块中将其关闭,为什么Jenkins的SonarQube插件会抱怨open语句? (我需要在单独的函数中验证数据库连接。) 问题答案: 我已经按照@TT的建议以这种方式重构了代码,而声纳 不再抱怨 。 没有“ try-with-resource”,代码可以按以下方式重构,但是在这种情况下,Sonar 仍然抱怨 :

  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

  • 问题内容: 我想同时显示两个(或更多) JFrame 。 当我关闭其中一个(使用默认的关闭按钮)时,其他框架仍应可见。 我怎样才能做到这一点? 问题答案: 如果您 不 希望应用程序在a 关闭时终止,请使用 代替 从文档中: (在WindowConstants中定义):不执行任何操作;要求程序处理注册的WindowListener对象的windowClosing方法中的操作。 (在WindowCon

  • 我想从class1调用class2,但是class2没有一个可以引用的主函数,比如