我正在构建一个3-tier应用程序,它使用java类为用户界面从db和jsp页面检索数据。当我试图在返回结果集的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()) { %>
...........
<% } %>我得到了我描述过的例外。你知道出了什么问题吗?提前谢谢你
发布于 2015-12-17 08:48:23
您正在尝试在关闭数据库连接ResultSet ( stmt1.close();和close();)之后访问它,这不是这样的。(更长的解释请参见甲骨文教程 )。
不要让连接处于打开状态,您应该检索ResultSet的内容,然后在您的JSP页面中使用它。这样,您就可以将DB查询的生命周期与视图生命周期分离开来。
发布于 2015-12-17 08:47:52
在您的示例中,当您调用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;
}发布于 2015-12-17 08:51:42
这是因为您正在关闭PreparedStatement对象,该对象在执行查询后立即创建ResultSet (可能还会关闭Connection)。
从Statement#close()方法的文档中(PreparedStatement是Statement的子项):
立即释放该语句对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常情况下,在资源完成后立即释放这些资源是很好的做法,以避免绑定数据库资源。 对已经关闭的语句对象调用方法close没有任何影响。 注:语句对象关闭时,其当前的ResultSet对象(如果存在)也将关闭。
强调我的。
理想情况下,您应该将ResultSet的内容具体化为一个正式的集合,并将该集合发送到JSP而不是ResultSet。
https://stackoverflow.com/questions/34329979
复制相似问题