大数据批量新增or修改太慢太Low,线程池CountDownLatchCompletableFuture完美解决

Posted SteveCode.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据批量新增or修改太慢太Low,线程池CountDownLatchCompletableFuture完美解决相关的知识,希望对你有一定的参考价值。

需求

上千万数据,分批处理,数据组装后插入到mysql当中。

痛病

插入效率(耗时极其长)

如何集合分段:

方式1

方式二

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>
        //拆分结合API
List<List<Integer>> partition = Lists.partition(list, 10);

拆分结合工具类:SplitListUtils

需求的解决方案与思路

public class MyCountDownLatch 
    public static final String SONG="---宋先阳";
    public static void main(String[] args) throws InterruptedException, ExecutionException 
        // 初始化线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(20);
        List<Integer> list = new ArrayList<>();
        // 往集合中添加数据
        IntStream.rangeClosed(0,20).forEach(list::add);
        // 集合分段
        List<List<Integer>> lists = SplitListUtils.split(list, 10);
        // 记录单个任务的执行次数
        CountDownLatch downLatch = new CountDownLatch(lists.size());
        // 新增数据的list
        List<String> insertList = Lists.newArrayList();

        for (List<Integer> integerList : lists) 
            // 有返回值的API
            CompletableFuture<List<String>> listCompletableFuture = CompletableFuture.supplyAsync(() ->
                    // 封装处理返回值的方法
                    getStrings(integerList),
                    // 自定义的线程池
                    threadPool
            );
            // 获取线程中结果放入:新增数据的list
            insertList.addAll(listCompletableFuture.get());
            // 任务个数 - 1, 直至为0时唤醒await()
            downLatch.countDown();
            System.out.println("个数::::"+downLatch.getCount());
        

        // 让当前线程处于阻塞状态,直到锁存器计数为零
        downLatch.await();
        // 批量新增
        if (!CollectionUtils.isEmpty(insertList)) 
            // 执行DAO中的批量新增:
            System.out.println(insertList);
        

    

    private static List<String> getStrings(List<Integer> integerList) 
        List<String> childList  = Lists.newArrayList();
        for (Integer integer : integerList) 
            String s=integer+SONG;
            childList.add(s);
        
        return childList;
    

学习 CountDownLatch、CompletableFuture 搭配使用:MyCountDownLatch

输出结果

以上是关于大数据批量新增or修改太慢太Low,线程池CountDownLatchCompletableFuture完美解决的主要内容,如果未能解决你的问题,请参考以下文章

Java批量更新太慢?多线程+List分段完美解决!

Mybatis-Plus批量插入数据太慢,使用rewriteBatchedStatements属性优化,堪称速度与激情!

Python之创建low版的线程池

用EXCEL批量获取网页标题的方法

Java 线程池 8 大拒绝策略,面试必问!

Django异步任务线程池