java.util.ConcurrentModificationException异常原因和解决方法

文章讲述了开发者在使用Java并行流处理大量数据并发插入数据库时遇到ConcurrentModificationException异常,分析了原因在于集合的非线程安全以及MyBatis批处理模式下的潜在问题,提出了解决方案,包括避免多线程操作和使用非批处理插入方式。

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

记录一个问题今天在开发中遇到了这样一个问题

由于数据量比较大,采用批量插入手动提交事务,在使用stream流进行处理时,想着并行流多线程进行数据处理耗时会少一点,通过parallel方法开启并行流,处理完成后在用打算进行forEach遍历入库,这是代码简单贴一下

List<Map<Integer, String>> dataList = new ArrayList<>();
//获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
        try {
            //获取mapper
            MapperRepository mapper = sqlSession.getMapper(MapperRepository.class);
            //开启并行流
            dataList.stream().parallel()
                    //构建对象对数据进行处理赋值
                    .map(map -> ComplaintAppeal.builder()
                            ........
                            .build())
                    //插入
                    .forEach(mapper::insert);
            sqlSession.commit();
            sqlSession.clearCache();
        } catch (Exception e) {
            log.info("批量插入失败:" + e);
            //未提交的数据可以回滚
            sqlSession.rollback();
        } finally {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值