首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用返回结果集的方法

调用返回结果集的方法
EN

Stack Overflow用户
提问于 2015-12-17 08:36:14
回答 4查看 796关注 0票数 0

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

ResultSet关闭后不允许进行操作。

例如,我有这样的方法:

代码语言:javascript
复制
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页面中编写以下内容时:

代码语言:javascript
复制
<%

ResultSet rs = panepistimio.getName(country);

while(rs.next()) { %>

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

我得到了我描述过的例外。你知道出了什么问题吗?提前谢谢你

EN

回答 4

Stack Overflow用户

发布于 2015-12-17 08:48:23

您正在尝试在关闭数据库连接ResultSet ( stmt1.close();close();)之后访问它,这不是这样的。(更长的解释请参见甲骨文教程 )。

不要让连接处于打开状态,您应该检索ResultSet的内容,然后在您的JSP页面中使用它。这样,您就可以将DB查询的生命周期与视图生命周期分离开来。

票数 2
EN

Stack Overflow用户

发布于 2015-12-17 08:47:52

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

例如:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-17 08:51:42

这是因为您正在关闭PreparedStatement对象,该对象在执行查询后立即创建ResultSet (可能还会关闭Connection)。

Statement#close()方法的文档中(PreparedStatementStatement的子项):

立即释放该语句对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常情况下,在资源完成后立即释放这些资源是很好的做法,以避免绑定数据库资源。 对已经关闭的语句对象调用方法close没有任何影响。 注:语句对象关闭时,其当前的ResultSet对象(如果存在)也将关闭。

强调我的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34329979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档