Jdbc 如何正确关闭连接?

Jdbc 如何正确关闭连接?,jdbc,connection,Jdbc,Connection,这个问题已经被问了很多次了,关于这个问题有很多资源在讨论。但这仍然让我担心,因为我认为close()不能正常工作 PreparedStatemet pstmt = null; try { pstmt = conn.prepareStatement(query); ... pstmt.close(); conn.close(); } catch(...) { ... } finally { if(pstmt != null) { try { p

这个问题已经被问了很多次了,关于这个问题有很多资源在讨论。但这仍然让我担心,因为我认为close()不能正常工作

PreparedStatemet pstmt = null;
try {
  pstmt = conn.prepareStatement(query);
  ...
  pstmt.close();
  conn.close();
} catch(...) {
  ...
} finally {
   if(pstmt != null) {
      try {
        pstmt.close();
      } catch (SQLException e) {
        pstmt = null;
      }
   }

   if(conn != null) {
      try {
         conn.close();
       } catch (SQLException e) {
         conn = null;
       }
    }

    System.out.println("PreparedStatement: " + pstmt);
    System.out.println("Connection: " + conn);
}
所以我希望它打印出空值;但它会不断打印出查询字符串和到数据库的连接路径

您的代码在这里

try {
  PreparedStatemet pstmt = null;
创建在finally块中不应可见的pstmt,因为它是另一个作用域中的局部变量

您可能在try-catch区块之外的某个地方有另一个pstmt。这就把你的支票弄乱了

尝试注释掉
PreparedStatemet pstmt=null在您的try块中查看您的代码是否仍然生成,这将帮助您确定pstmt的覆盖声明的确切位置

编辑: 关闭准备好的语句/连接并不意味着这些值将被重置。您的connection&prepared语句现在确实已关闭,因为您没有将它们设置为null,所以存储在其中的数据值仍在打印中。这应该不是问题


虽然不是什么大问题,但在关闭conn和pstmt时,也可以将它们设置为null,这样也可以清除这些变量使用的本地内存。但是请记住,当您执行关闭呼叫时,连接仍然处于关闭状态。

我的错误输入,我的PreparedStatement在try-catch块之外。我现在编辑代码为什么?它可以打印出它喜欢的任何东西。你的期望显然是错的。对不起,我不明白你的意思。我认为当我们关闭ptsmt和conn时;它们都应该变为null,不是吗?不。(a)当您将它们设置为null时,引用将变为null。不是这样。(b) 您看到的是对非null引用调用toString()的结果,该引用可以是相关类喜欢的任何引用。哦,我明白了。谢谢你的澄清。