异步上传数据,比批量上传速度快

public Integer uploadUser1(List<UserVo> list, Integer uploadType) {
        // 如果上传类型为全量替换,则先删除所有未删除的用户。
        if (UserEnum.TOTAL_REPLACE.getValue().equals(uploadType)) {
            userMapper.delete("deleted", String.valueOf(0));
        }
        // 使用AtomicInteger来线程安全地统计成功上传的用户数量。
        // 使用AtomicInteger作为线程安全的计数器 这是一个线程安全的类,它的incrementAndGet方法保证了原子性,即使在多线程环境下也能正确地增加计数。
        AtomicInteger successCounter = new AtomicInteger(0);
        // 使用流式编程和CompletableFuture实现异步上传。
        List<CompletableFuture<Void>> futures = list.stream()
                // 统一设置用户密码。
                // 由于peek操作不会改变流的元素顺序或产生新的集合,因此在此阶段不会引发并发问题。
                .peek(userVo -> userVo.setPassword("123456"))
                // 将用户信息转换为User对象,并异步插入数据库。
                // CompletableFuture.runAsync: 这个方法用于异步执行给定的Runnable,每个CompletableFuture都是独立运行的,由executor管理调度。这意味着每个插入操作都在不同的线程中执行,相互之间不会直接冲突
                .map(userVo -> CompletableFuture.runAsync(() -> {
                    User user = BeanUtils.toBean(userVo, User.class);
                    try {
                        userMapper.insert(user);
                        successCounter.incrementAndGet(); // 成功插入后计数器加1
                    } catch (Exception e) {
                        // 处理插入失败的情况
                        System.err.println("Failed to insert user: " + e.getMessage());
                    }
                }, executor))
                .collect(Collectors.toList());

        // 等待所有异步任务完成。
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

        // 返回成功上传的用户数量。
        return successCounter.get(); // 返回成功插入的用户数量
    }

坏处:频繁调用数据库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值