首页  >  文章  >  数据库  >  如何避免Java中的'java.sql.SQLException:ResultSet关闭后不允许操作”?

如何避免Java中的'java.sql.SQLException:ResultSet关闭后不允许操作”?

Barbara Streisand
Barbara Streisand原创
2024-11-27 03:09:10558浏览

How to Avoid `java.sql.SQLException: Operation not allowed after ResultSet closed` in Java?

返回结果集

在查询数据库时,需要有效地处理返回的结果。当尝试从查询数据库的方法返回 ResultSet 时,会出现一个常见问题。但是,直接返回 ResultSet 会导致资源泄漏和资源管理不当。

错误“java.sql.SQLException:ResultSet 关闭后不允许操作”表明 ResultSet 对象在该方法可以关闭之前已被关闭返回它。要解决此问题,建议将 ResultSet 映射到 Javabean 集合并返回它。这种方法确保 ResultSet 在使用后自动关闭,防止资源泄漏。

下面提供了如何将 ResultSet 映射到 Javabean 列表的示例:

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}

在此例如,list() 方法查询数据库,将结果映射到 Biler 对象列表,然后返回该列表。这可以确保 ResultSet 正确关闭并防止资源泄漏。

另一种方法是使用 try-with-resources 语句,该语句会在代码块完成时自动关闭资源:

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}

通过遵循这些建议,开发人员可以确保正确处理 ResultSet,防止资源泄漏并确保 Java 应用程序中高效的数据库访问。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn