gpt4 book ai didi

java - 关闭连接 : next in java

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:17 27 4
gpt4 key购买 nike

我有 ResultSet 方法,我将在 finally block 中关闭连接:

 public static ResultSet countdrcountcr(String vforacid) throws SQLException {
ResultSet rs = null;
Connection conn = null;
try {

conn = db.getDbConnection();
String sql = "SELECT NVL (SUM (DECODE (part_tran_type, 'D', 1, 0)), 0), "
+ " NVL (SUM (DECODE (part_tran_type, 'C', 1, 0)), 0) "
+ " FROM tbaadm.htd WHERE acid IN (SELECT acid "
+ " FROM tbaadm.gam WHERE foracid = '" + vforacid + "') "
+ " AND tran_date >= '22-NOV-2013' AND tran_date <= '30-NOV-2013' "
+ " AND pstd_flg = 'Y' AND del_flg != 'Y'";
PreparedStatement ps = conn.prepareStatement(sql);
rs = ps.executeQuery();

return rs;
} finally {
conn.close();
}
}

但是我得到了错误:

编辑整个 ErrorTrace

Exception in thread "main" java.sql.SQLException: Closed Connection: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:181)
at statement.Statement.main(Statement.java:34)
Java Result: 1

我做错了什么?

最佳答案

您正在返回一个 ResultSet 以供将来使用,但在使用它之后您将关闭连接,因此您无法检索数据,因为资源已经关闭。请注意,始终调用 finally,即使您在 trycatch 代码块中返回某些内容,请参阅 Does finally always execute in Java?

详细来说,就是这个问题:

  1. 打开连接
  2. 准备一份声明
  3. 获取结果集
  4. 返回结果集
  5. 关闭连接(这可能会关闭关联的资源,即它可能会关闭与当前 Connection 关联的 PreparedStatementResultSet)因为,如之前链接中所述,finally block 总是至少在 JVM 崩溃或您使用 System.exit 手动完成应用程序时执行.
  6. 使用封闭的ResultSet。由于上一步,它已关闭。

一个可能的解决方案是您的 countdrcountcr 方法和所有其他返回 ResultSet 的方法接收 Connection 作为参数,因此该方法调用它将处理连接的打开和关闭。另外,请注意,如果您在多线程环境中工作,则不应使用 static 方法来处理数据库操作,例如一个网络应用程序。

关于java - 关闭连接 : next in java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com