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

Java中关闭数据库连接的合适方式是什么?

宗政法
2023-03-14

我试图关闭数据库连接。但是有了一点困惑,说

ResultSet rs = null 

我是否必须靠近它

rs.close();

或者

DatabaseUtil.closeResultSet(rs);

这两者之间有什么区别?

共有3个答案

白嘉志
2023-03-14

jdbc api告诉我们,关闭连接将会关闭结果集和语句。关闭语句将关闭结果集。但是我总是自己关闭每个结果集和每条语句,因为我遇到了不这样做的问题。只需使用您的结果集、语句和连接提供的close方法。

秦胡媚
2023-03-14

这些方法仅关闭结果集。您仍然必须关闭所有<code>语句

Connection conn = null;
Statement stmt = null'
ResultSet rs = null;
try {
  conn = getConnection();
  stmt = conn.prepareStatement(sql);
  stmt.setString(1, "Hello"); 
  rs = stmt.executeQuery();
  while (rs.next()) {
    // ...
  }
} catch (SQLException se) {
  se.printStackTrace();
} finally {
  if (rs != null) {
    try {
      rs.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  if (stmt != null) {
    try {
      stmt.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  if (conn != null) {
    try {
      conn.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

如果您使用我的< code>Close实用程序,finally块可能是,

} finally {
  Close.close(rs, stmt, conn);
}
王修为
2023-03-14

关闭结果集不会关闭数据库连接。您需要单独执行此操作。

通常,您需要关闭如下资源:

if (resultSet != null) {
     try {
         resultSet.close();
     } catch (SQLException e) {
         log.info("closing resultset caused exception", e);
     }
}

如果这是 DatabaseUtil 所做的,那么这将是可取的。

使用资源试用会产生更漂亮的代码,但请注意,一个边缘情况的行为非常不同。如果在关闭 resultSet 时引发异常(在其他所有操作都没有问题之后),则使用上述代码不会传播该异常,因此它不会阻止事务的其余部分完成。但是,如果使用资源试用,则 close 方法引发的异常将传播。关闭 resultSet 或语句时引发的异常只是关于释放数据库资源(无论如何,数据库资源最终会被释放,这不是危机),它并不表示任何数据问题,似乎也不是破坏html" target="_blank">数据库操作的理由。

您应该在关闭结果集后关闭数据库连接。确保您使用最终块,以便无论抛出什么异常(包括关闭语句或结果集时抛出的异常),都会关闭连接。

这个问题中的代码是如何不这样做的一个例子(OP可能想最小化示例中的样板,因为关闭事情不是问题的重点,所以它可能是这样为了保持简短,而不是因为OP不知道不这样做), 它演示了现实生活中发生的常见错误:

Class Class1<T>
{
  public T getColumn(DataSource ds)
  {
    T value = null;
    Connection con = null;
    Statement st = null;

    try
    {
      con = ds.getConnection();
      st = con.createStatement();
      ResultSet rs = st.executeQuery("select 1 from dual");
      rs.next();
      Object o = rs.getObject(1); // I want an Integer but a BigDecimal is created!
      value = (T) o; // ClassCastException here!
    }
    finally
    {
      if (st != null) { st.close(); }
      if (con != null) { con.close(); }
    }

    return i;
  }
}

如果 statement.close 抛出一个 SQLException,则永远不会调用 finally 块中的以下行,连接不会被关闭,并且数据库连接将闲置,直到超时。这似乎并不坏,因为它只有一个连接,但每个其他连接都可能看到相同的行为,并且在适当的情况下,您可以以这种方式关闭整个应用程序(丢弃所有数据库连接)。请参阅 Michael Nygard 的书《Release It!》,了解一个描述非常昂贵且痛苦的企业应用程序中断的故事,该中断可以追溯到与此完全相同的代码。

必须剪切和粘贴此资源关闭代码很难看,引入类似于传入resultset映射器的模板方法,以便只在一个位置完成关闭,这将是一种改进。但这让您踏上了重塑spring jdbc的道路,它已经为您完成了这一切。

 类似资料:
  • 问题内容: 我试图关闭数据库连接,但是有点困惑 我是否必须靠近它 要么 两者之间有什么区别? 问题答案: 这些方法只能关闭。您仍然必须关闭全部和实例。我建议这样做。就像是, 如果您使用我的实用程序,则finally块可能是,

  • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通

  • 我正在使用sql server 2008。我需要检查是否可以使用服务器名称、端口号、数据库名称、用户名和密码建立连接。 有没有简单的方法可用?

  • 问题内容: 我并不像php开发人员,但我必须使用它,而且我不太了解PHP在会话期间如何处理内存分配。 我正在开发一个要求进行HTTP身份验证的应用程序,一旦登录,便可以通过一个漂亮的界面来操作数据。 有人在另一篇文章中告诉我,我不应该在每次执行后关闭mysql数据连接,但是我不知道在使用此应用程序期间该连接如何保持内存,因为在服务器端我不知道PHP保留了什么内容记忆与否。 所以我的问题是我应该使用

  • 问题内容: 我在hibernate状态下使用jpa。我有以下方法: 可以,但是它关闭了与数据库的连接。当秒被执行时 引发什么原因 我的配置: 编辑 我不知道为什么“ firstJDBCTemplateQuery”关闭数据库连接。如何解决这个问题? 堆栈跟踪: 编辑 我检查了堆栈跟踪。 编辑 我用 是 是 编辑调试结果 : 启动Beginin交易: /////////////////////////

  • 这是我目前的代码。我有几个问题: 数据库正忙-错误 SQL错误或缺少数据库 结果集已关闭 如果我想防止这两个错误,我应该使用哪种代码结构?我需要在try块中连接吗?我需要在哪里关闭连接?我需要在哪里关闭准备语句? 直到现在,我还无法通过自己连接不同页面的信息来找到解决方案。