封闭连接:java中的下一个

Err*_*ion 3 java jdbc

我有ResultSet方法,我在一个finallly块中关闭Connection:

 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误:

编辑整个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
Run Code Online (Sandbox Code Playgroud)

我做得不对劲?

Lui*_*oza 8

您将返回以ResultSet供将来使用,但在使用它之后您将关闭连接,因此您无法检索数据,因为资源已关闭.请注意finally,即使您在trycatch代码块中返回某些内容,也始终会调用它,请参阅最终是否始终在Java中执行?

详细而言,这就是问题所在:

  1. 打开连接
  2. 准备一份声明
  3. 获取结果集
  4. 返回结果集
  5. 关闭连接(可能会关闭相关资源,即它可能会关闭PreparedStatementResultSet与当前关联Connection),因为如前面的链接所示,finally阻止始终至少执行JVM崩溃或您手动完成应用程序System.exit.
  6. 使用封闭ResultSet.它由于上一步而关闭.

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