如何正确关闭连接?

时间:2014-08-01 20:55:27

标签: jdbc connection

这个问题已被多次询问,并且有很多资源都在讨论这个问题。但它仍然让我担心,因为我认为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);
}

所以我预计会打印出null;但它会打印出查询字符串和数据库的连接路径。

1 个答案:

答案 0 :(得分:0)

您的代码

try {
  PreparedStatemet pstmt = null;

创建一个在finally块中不可见的pstmt,因为它是另一个范围内的局部变量。

你可能在try catch块之外的某个地方有另一个pstmt。这是在finally块中弄乱你的支票。

尝试在try块中注释掉PreparedStatemet pstmt = null;以查看代码是否仍然构建,这将有助于您确定pstmt的覆盖声明到底在哪里。

修改 关闭准备好的语句/连接并不意味着将重置值。你的联系和准备好的语句现在确实已关闭,因为您没有将它们设置为null,所以内部存储的数据值仍在打印中。这应该不是问题。

虽然不是一个大问题,但是当你关闭它们时,你也可以将conn和pstmt设置为null,以清除这些变量所使用的本地内存。但请记住,当您进行近距离通话时,连接仍然已关闭。