首页 >数据库 >mysql教程 >使用 JDBC 时,为什么我的 Java 代码会抛出'结果集关闭后不允许操作”错误?

使用 JDBC 时,为什么我的 Java 代码会抛出'结果集关闭后不允许操作”错误?

Barbara Streisand
Barbara Streisand原创
2024-11-02 03:56:03362浏览

Why does my Java code throw a

JDBC ResultSet 错误:“结果集关闭后不允许操作”

在 Java 中,使用 JDBC 连接数据库并通过以下方式执行查询如果连接过早关闭,ResultSet 可能会导致错误。

原因:

JDBC ResultSet 不是查询结果的完整表示。相反,它提供了与数据库的实时连接,允许您逐行获取结果。如果连接关闭,ResultSet 将失去连接并变得无效。

错误消息:

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

代码示例:

以下代码演示了错误:

<code class="java">ResultSet rs = null;
Connection connection = null;
Statement st = null;
try {
    connection = DriverManager.getConnection("databaseadress","username","password");
    st = connection.createStatement();  
    rs = st.executeQuery(query);
} catch (...) {} // exception handling
finally {
    if (rs != null) rs.close();
    if (st!= null) st.close();
    if (connection != null) connection.close();
}</code>

在此代码中,发生错误是因为即使在连接关闭后,rs 仍在finally 块之外使用。

解决方案:

要避免此错误,您应该在数据库连接范围内基于 ResultSet 填充瞬态对象或集合。连接关闭后,可以毫无问题地返回或使用瞬态对象或集合。

重构代码:

<code class="java">public static <T> List<T> sqlquery (String query, RowMapper<T> rowMapper) throws SQLException {
    Connection connection = null;
    Statement st = null;
    ResultSet rs = null;
    connection = DriverManager.getConnection("databaseadress","username","password");
    st = connection.createStatement();  
    rs = st.executeQuery(query);
    List<T> list = new ArrayList<>();
    while (rs.next()) {
        list.add(rowMapper.mapRow(rs));
    }
    if (rs != null) rs.close();
    if (st != null) st.close();
    if (connection != null) connection.close();
    return list;
}</code>

以上是使用 JDBC 时,为什么我的 Java 代码会抛出'结果集关闭后不允许操作”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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