开发者社区> 问答> 正文

获取java.sql.SQLException:ResultSet关闭后不允许进行操作

当我执行以下代码时,出现异常。我认为这是因为我正在与他相同的连接对象编写新语句。我应该如何重写它,以便可以创建准备好的语句并开始使用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

展开
收起
保持可爱mmm 2020-05-11 11:40:10 444 0
1 条回答
写回答
取消 提交回答
  • 问题在于您在中获取数据的方式getStuff()。每次访问getStuff()您都会获得新鲜的食物,ResultSet但您不会关闭它。

    这违反了Statement该类的期望(请参见此处-http : //docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):

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

    更糟糕的是rs调用代码中的。它也从statement字段外派生,但未关闭。

    底线:您有多个ResultSet与同一个Statement对象同时打开。来源:stack overflow

    2020-05-11 11:40:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spark SQL: Past, Present and Future 立即下载
Spark SQL:Past Present &Future 立即下载
GeoMesa on Spark SQL 立即下载