首页 > 数据库 > mysql教程 > 使用 JDBC 时,为什么我会收到'java.sql.SQLException:ResultSet 关闭后不允许操作”?

使用 JDBC 时,为什么我会收到'java.sql.SQLException:ResultSet 关闭后不允许操作”?

DDD
发布: 2024-10-29 14:07:02
原创
974 人浏览过

Why Am I Getting

Java - 连接关闭后无法使用结果集

问题:

尝试使用 JDBC 执行数据库查询会导致以下错误:

java.sql.SQLException: Operation not allowed after ResultSet closed
登录后复制

分析:

JDBC 使用 ResultSet 对象从查询中检索数据。但是,当与数据库的连接关闭时,ResultSet 对象将变得无效并且无法再使用。

解决方案:

要解决此问题,请避免通过ResultSet 对象超出执行查询的方法。相反,使用 ResultSet 填充对象或列表并返回结果对象。

填充对象的示例代码:

<code class="java">public static Collection<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);
    Collection<T> collection = new ArrayList<>();
    while (rs.next()) {
        collection.add(rowMapper.mapRow(rs));
    }
    // Close resources even if exceptions are thrown
    closeGracefully(rs, st, connection);
    return collection;
}</code>
登录后复制

优雅地关闭资源:

<code class="java">private static void closeGracefully(ResultSet rs, Statement st, Connection connection) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (st != null) {
        try {
            st.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
}</code>
登录后复制

其他注意事项:

  • 使用行映射器从 ResultSet 的每一行创建对象。
  • 参数化查询以防止 SQL 注入攻击。
  • 考虑使用第三方库(例如 JDBC 或 Spring JDBC)来简化数据库访问。

以上是使用 JDBC 时,为什么我会收到'java.sql.SQLException:ResultSet 关闭后不允许操作”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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