首页 > 数据库 > mysql教程 > 如何解决 Java 中的'java.sql.SQLException:结果集关闭后不允许操作”异常?

如何解决 Java 中的'java.sql.SQLException:结果集关闭后不允许操作”异常?

DDD
发布: 2024-12-10 07:22:09
原创
407 人浏览过

How to Resolve a

不允许操作:Java 中的 ResultSet 关闭异常

在执行某些 SQL 查询时,开发人员可能会遇到“java.sql.SQLException:结果集关闭后不允许操作”异常。当从同一个 Statement 对象同时尝试多个 ResultSet 时,通常会发生此错误。

请考虑演示此问题的以下代码片段:

// Problem code: using the same statement object to create multiple ResultSets

try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Prepare a new statement and attempt to use rs2
    PreparedStatement pst = (PreparedStatement)connection.prepareStatement("INSERT INTO `blah`............");

    // Process data from rs2 and update the database using pst
    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();
}
登录后复制

在此代码中,两个 ResultSet(rs 和 rs ) rs2) 是从同一个 Statement 对象(语句)创建的。然而,虽然 rs 没有显式关闭,但当执行第二个查询并获取 rs2 时,它会隐式关闭。这会导致异常,因为 rs2 正在尝试对关闭的 ResultSet 进行操作。

解决方案:

要解决此问题,在使用之前关闭所有 ResultSet 至关重要相同的Statement对象来获取新的ResultSets。这可以通过使用 try-finally 块来确保即使发生异常也关闭 ResultSet:

// Corrected code: closing the ResultSet objects
try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Use rs to retrieve data
    if(rs.next()) {
        String name = rs.getString("name");
    }

    // Close rs
    rs.close();

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Use rs2 to retrieve data
    while(rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

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

    // Close rs2
    rs2.close();

    pst.executeBatch();
} catch (Exception e) {
    e.printStackTrace();
}
登录后复制

以上是如何解决 Java 中的'java.sql.SQLException:结果集关闭后不允许操作”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板