java 多线程批量入库

// 根据异步操作数设置线程
    private ExecutorService threadPool = Executors.newFixedThreadPool(16);


    @ApiOperation("多线程插入百万级数据--结果:开8个线程117秒; 开10个 111秒")
    @GetMapping("testMultithreadingBatchInsert")
    public String testMultithreadingBatchInsert() {


        List<MainSysWlDet> insertlist = ADOConnection.runTask(factory->{
            MainSysWlDetMapper mapper = factory.getMapper(MainSysWlDetMapper.class);
            return mapper.queryAll();
        }, List.class);

        Date big = DateUtil.date(System.currentTimeMillis());

        // 倒计时数为异步线程数
        CountDownLatch latch = new CountDownLatch(16);

        // 每份大小
        int spileSize = insertlist.size() / 16;

        // 异步返回结果
        List<Future<Boolean>> futures = new ArrayList<>();
        Lists.partition(insertlist, spileSize).stream().forEach(par -> {


            // 遍历需要异步的请求,并提交至线程池
            Future<Boolean> submit = threadPool.submit(() -> {


                List<List<MainSysWlDet>> parpar = Lists.partition(par, 300);
                Boolean flag = ADOConnection.runTask(factory->{
                    for (List<MainSysWlDet> ppi : parpar) {
                        MainSysWlDetTempMapper mapper = factory.getMapper(MainSysWlDetTempMapper.class);
                        mapper.batchInsert(ppi);
                    }
                    return true;
                }, Boolean.class);
                // 调用await方法等待
                latch.countDown();
                return flag;


            });


            futures.add(submit);
        });

        try {
            // 等待本地提交的异步操作完成
            latch.await();
        } catch (Exception e) {
            e.printStackTrace();
        }

        Date end = DateUtil.date(System.currentTimeMillis());
        System.out.println(DateUtil.between(big, end, DateUnit.SECOND) + "秒");

        return DateUtil.between(big, end, DateUnit.SECOND) + "秒";
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值