2015-12-17 134 views
0

我在构建一个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()) { %> 

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

我得到我所描述的异常。你有什么想法是错误的?预先感谢您

+1

你确切想要返回什么结果集或查询结果? –

+0

数据库的内容。在这种情况下,我需要数据库上的大学的名称 – nikiforosb

+0

然后,您首先从ResultSet获取内容,然后使用String返回它,但是关闭ResultSet然后返回,它绝对不起作用。 –

回答

1

在您的示例中,当您致电stmt1.close()时,ResultSet已关闭。在单一方法中执行数据库访问,将结果添加到适当的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页面中使用它。 这样,就可以将DB查询的生命周期从视图生命周期中分离出来。

0

你打电话关闭声明,你不应该这样做。

其次,你不应该忍受如catch(Exception e2) {}的豁免。 这使得追踪错误变得困难或不可能。

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

1

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

从为Statement#close()方法的文档(PreparedStatementStatement孩子):

释放此Statement对象的数据库和JDBC资源,而不是等待时,自动关闭这种情况发生。一旦您完成了资源释放资源以避免捆绑数据库资源,通常是一种很好的做法。

在已经关闭的Statement对象上调用close方法没有效果。

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

强调我的。

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