获取java.sql.SQLException:结果集关闭后不允许操作

获取java.sql.SQLException:结果集关闭后不允许操作,java,mysql,jdbc,prepared-statement,resultset,Java,Mysql,Jdbc,Prepared Statement,Resultset,当我执行以下代码时,我得到一个异常。我想这是因为我在用同一个连接对象准备新语句。我应该如何重写它,以便创建一个准备好的语句并开始使用rs2?即使连接到同一个数据库,我也必须创建新的连接对象吗 try { //Get some stuff String name = ""; String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";

当我执行以下代码时,我得到一个异常。我想这是因为我在用同一个连接对象准备新语句。我应该如何重写它,以便创建一个准备好的语句并开始使用rs2?即使连接到同一个数据库,我也必须创建新的连接对象吗

    try 
    {
        //Get some stuff
        String name = "";
        String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
        ResultSet rs = statement.executeQuery(sql);
        if(rs.next())
        {
            name = rs.getString("name");
        }

        String sql2 = "SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";";
        ResultSet rs2 = statement.executeQuery(sql2);
        String updateSql = "INSERT INTO `blah`............"; 
        PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);    

        while(rs2.next()) 
        { 
            int id = rs2.getInt("id");
            int stuff = getStuff(id);

            pst.setInt(1, stuff);
            pst.addBatch();

        }

        pst.executeBatch();

    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

private int getStuff(int id)
{

    try
    {   

            String sql = "SELECT ......;";
            ResultSet rs = statement.executeQuery(sql);

            if(rs.next())
            {
                return rs.getInt("something");

            }
            return -1;
    }//code continues
ResultSet对象将自动创建 当语句对象 生成后关闭,重新执行, 或用于检索下一个结果 从多个结果的序列中


我猜在
while(rs2.next())
之后,您正试图从rs1访问某些内容。但它已经关闭了,因为您重新执行了语句以从中获取rs2。由于您没有关闭它,我相信下面还会使用它。

问题在于在
getStuff()中获取数据的方式。每次访问
getStuff()
时,都会获得一个新的
ResultSet
,但不会关闭它

这违反了
语句
类的预期(请参见此处-):

默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象

更糟糕的是调用代码的
rs
。它也是从
语句
字段派生的,但它没有关闭


底线:您有几个
结果集
与同一
语句
对象同时打开。

调用while时第一次发生?不,它发生在第二个循环中。因为在这段时间内,我再次调用了一个私有方法,该方法初始化了另一个ResultSet并执行了更多的查询。能否显示在第一次迭代中执行的其余代码?是否会因为另一个ResultSet而发生异常?只是添加了更多的代码。事实上,我没有从rs1中得到任何东西。那些古老的Java类设计得如此怪异:(很酷。我在getStuff()中创建了一个新语句,解决了这个问题。你是否尝试过关闭ResultSet?看起来比创建一个新语句更干净。