mysql批量删除时出现java.sql.SQLException: Operation not allowed after ResultSet closed

本文讲述了在Java中使用JDBC批量删除数据时遇到的SQLException,特别关注了在查询后关闭ResultSet导致的异常。通过调整循环条件,确保ResultSet在操作完成后再关闭,从而成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用java批量删除数据时,出现了java.sql.SQLException: Operation not allowed after ResultSet closed异常,具体的异常信息如下:
在这里插入图片描述
代码信息如下:

/**
 * 删除指定时间点之前的所有数据
 * @param endTime 时间点
 * @throws Exception
 */
public static void removeOldEma(String endTime) throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    Statement stmt = conn.createStatement();
    // 因为使用数据库,对批量操作有事务的条数要求,因为需要先查询目标删除数量,再进行批量删除
    String countSql = "SELECT COUNT(*) AS sumNumber FROM tableName WHERE AcquisitionTime < '" + endTime + "'";
    String sql = "DELETE FROM tableName WHERE AcquisitionTime < '" + endTime + "' LIMIT 10000";
    try {
        ResultSet resultSet = stmt.executeQuery(countSql);
        while (resultSet.next()) {
            try {
                int number = resultSet.getInt("sumNumber");
                int count = number / 10000;
                if (number < 10000 || 0 != count){
                    for (int i = 0 ;i <= count; i++){
                        stmt.executeUpdate(sql);
                    }
                }
            }catch (Exception e){
                logger.error("未查询到数据: SQL:" + sql);
            }
        }
    }catch (Exception e){
        logger.error("Exception when removeOldEma: ", e);
    }finally {
        stmt.close();
        conn.close();
    }
}

跟踪代码发现,在最后一次数据删除后,resultSet被关闭,while循环体中判断resultSet时就会出现异常。于是将while循环的条件修改为 while (!resultSet.isClosed() && resultSet.next())后问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值