SQLException:java.sql.SQLException:ResultSet关闭后不允许操作,而ResultSet从未关闭

时间:2015-06-05 10:24:19

标签: java jdbc sqlexception

我知道 - 我们无法在此关闭后致电ResultSet。这是一个很好的做法,在使用此关闭后关闭每个ResultSetStatementConnection

但在我的代码中,我从未关闭连接,为什么会有 -

  

java.sql.SQLException:ResultSet关闭后不允许操作

我的代码如下:

编辑 -

try{
        Connection con=CommonUtil.getConnection();
        Statement st=con.createStatement();

        ResultSet rs=st.executeQuery("select * from logirecord");
        int flag=0;
        while(rs.next()){
            if(rs.getString(2).trim().equals(username)&&rs.getString(3).trim().equals(password)){
                flag=1;

                ResultSet rs1=st.executeQuery("select * from personrecord where LoginId='"+ rs.getString(1).trim()+"'");
                if(rs1.next()){
                String name=rs1.getString(1);
                String address=rs1.getString(2);
                String hobby=rs1.getString(4);
                }
                //Exception here.
                ResultSet rs2=st.executeQuery("select * from interest where LoginId='"+rs.getString(1).trim()+"'");
                //at com.org.test.LoginServlet.doPost(LoginServlet.java:49)
                if(rs2.next()){
                String interest=rs2.getString(2);
                String interest2=rs2.getString(3);
                String interest3=rs2.getString(4);
                }
                request.getRequestDispatcher("display.jsp").forward(request, response);
                return;
            }
        }   
    }catch(Exception e){
        e.printStackTrace();
    }

2 个答案:

答案 0 :(得分:2)

您有多个与同时打开的同一Statement对象相关的ResultSet。 (见这里 - http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。 Statement中的所有执行方法   如果是,接口隐式关闭一个语句的当前ResultSet对象   打开一个。

而你并没有关闭那使它更糟糕的事情。

答案 1 :(得分:0)

你得到了

java.sql.SQLException: Operation not allowed after ResultSet closed

因为您在遍历另一个相同连接的结果集时尝试遍历结果集。

如果您从同一个数据库中嵌套处理两个结果集,那么您就会做错事。这些集合的组合应该在数据库方面完成。