当前位置: 首页 > 面试题库 >

封闭的连接:java中的next

钦耀
2023-03-14
问题内容

我有一个ResultSet方法,该方法将最终关闭连接:

 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

我在做什么不对?


问题答案:

您将返回一个a
ResultSet以便将来使用,但是在使用它之后,您将关闭连接,因此由于资源已关闭,因此您无法检索数据。请注意finally,即使您在trycatch代码块中返回了某些内容,也始终会调用它,

详细来说,这就是问题所在:

  1. 打开连接
  2. 准备一份声明
  3. 获取结果集
  4. 返回结果集
  5. 关闭连接(可能会关闭关联的资源,即可能会关闭PreparedStatementResultSet当前资源的关联Connection),因为正如前面的链接中所述, 始终* 至少在JVM崩溃的情况下执行finally块,或者使用手动完成应用程序。 *System.exit
  6. 使用封闭式ResultSet。由于上一步已关闭。

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



 类似资料:
  • 我正在实现一个TCP堆栈,并且遇到了半关闭连接的问题。 我的实现充当服务器端。客户端建立连接,然后发送一些数据,然后发送“FIN”消息。然后,服务器确认来自客户端的数据,发送自己的一些数据,然后才关闭其一半的连接(发送“FIN”)。 问题是,客户端没有确认服务器在半封闭连接上发送的数据,也没有确认其最终的“FIN”消息。根据netstat,客户端处于FIN_WAIT2状态。在服务器不发送任何数据的

  • 问题内容: 我正在使用以下代码从Go应用执行SET和EXPIRE。 但我开始出现错误: 使用封闭的网络连接 。我使用Gary Burd的Redigo软件包和RedisLabs。 我连接到Redis的代码是: 问题答案: 您可以使用来管理多个连接,检查空闲连接是否仍在运行,并自动获取新连接。您也可以在拨打新连接时自动执行AUTH步骤:

  • SQL server处于混合模式,其在本地机器中。我的连接字符串是jTDS jdbc:jtds:sqlserver://machineName:1433;databaseName=db;integratedsecurity=true 堆栈跟踪是 com.microsoft.sqlserver.jdbc.sqlserverException:用户“username”登录失败。在com.microso

  • void fl_polygon(int x, int y, int x1, int y1, int x2, int y2) void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) Fill a 3 or 4-sided polygon. The polygon must be convex.

  • 问题内容: 我正在实现一个小型TCP服务器。我怎么知道我的一位客户是否关门?我应该只是尝试读取或写入并检查是否为零? 问题答案: 该线程“ 的最佳方式可靠地检测TCP连接被关闭 ”,使用了“ ”(也可见于或或许多其他情况下): 为了检测超时,建议: 更新2019:tuxedo25在评论中提到: 在Go 1.7+中,零字节读取立即返回,并且永远不会返回错误。 您必须读取至少一个字节。 参见commi