【问题标题】:Calling a method which returns Resultset调用返回结果集的方法
【发布时间】:2016-03-23 15:35:01
【问题描述】:

我正在构建一个 3-tier 应用程序,它使用 java 类从用户界面的 dbjsp 页面检索数据。当我尝试在返回结果集的 jsp 页面中调用方法时,我收到以下错误消息:

ResultSet 关闭后不允许操作。

比如我有这个方法:

public ResultSet getName(String country) throws SQLException {
    String name;
    try {
        open();
        stmt1 = con.prepareStatement(fetchPanepistimio);
        stmt1.setString(1,country);
        rs1 = stmt1.executeQuery();
        stmt1.close();
        close();
    }catch(Exception e2) {
    }

    return rs1;

}

当我在 jsp 页面中编写以下内容时:

<%

ResultSet rs = panepistimio.getName(country);

while(rs.next()) { %>

...........
<% } %>

我得到了我描述的异常。您对出了什么问题有任何想法吗?提前谢谢你

【问题讨论】:

  • 你到底想返回什么,ResultSet 还是 Query 结果?
  • 数据库的内容。在这种情况下,我想要数据库中的大学名称
  • 那你先从ResultSet中获取内容然后用String返回,但是你关闭ResultSet再返回,肯定不行。
  • 这是因为你 close();在得到结果集之前
  • @BahramdunAdil 我会试试的。非常感谢。

标签: java jsp exception jdbc resultset


【解决方案1】:

在您的示例中,ResultSet 在您调用 stmt1.close() 时关闭。在单一方法中执行数据库访问,将结果添加到适当的Collection 并返回。

例如:

public Collection<String> getName(String country) {
    String sql = "...";
    Collection<String> names = new ArrayList<>();
    try(Statement statement = ...; ResultSet resultSet = statement.executeQuery(sql)){
        while(resultSet.next()) {
            names.add(resultSet.getString(...));
        }
    } catch (SQLException e) {
        // LOG
    }
    return names;
}

【讨论】:

    【解决方案2】:

    您在关闭数据库连接stmt1.close();close();) 后尝试访问ResultSet,但这种方式不起作用。 (更多解释请参见Oracle's tutorial)。

    您应该检索ResultSet 的内容,然后在您的JSP 页面中使用它,而不是让连接保持打开状态。 这样,您就可以将数据库查询的生命周期与视图生命周期解耦。

    【讨论】:

      【解决方案3】:

      您不应该在声明上调用 close。

      其次,你不应该像catch(Exception e2) {} 那样吞下例外。 这使得追踪错误变得困难或不可能。

      第三,在 JSP 中迭代 ResultSet 不是一个好习惯。这应该在后端完成,例如(在getName)。见How to avoid Java code in JSP files?

      【讨论】:

        【解决方案4】:

        这是因为您在执行查询后立即关闭了创建 ResultSetPreparedStatement 对象(并且可能还关闭了 Connection)。

        来自Statement#close() 方法的文档(PreparedStatementStatement 的子代):

        立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生。通常最好在使用完资源后立即释放资源,以避免占用数据库资源。

        对已关闭的 Statement 对象调用 close 方法无效。

        注意:当 Statement 对象关闭时,其当前的 ResultSet 对象(如果存在)也将关闭。

        强调我的。

        理想情况下,您应该将ResultSet 的内容具体化为正式集合,并将该集合发送到JSP 而不是ResultSet

        【讨论】:

          猜你喜欢
          • 2015-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多