Java批量更新插入太慢?list分段+多线程处理

阅读: 评论:0

Java批量更新插入太慢?list分段+多线程处理

Java批量更新插入太慢?list分段+多线程处理

Java批量更新插入太慢?list分段+多线程处理

前言

当需要插入或修改大量数据时,我们会选择mybatis的批处理,但是这存在一些弊端

  • 数据量极大时会很慢,小号数据库性能
  • 大数据量的时候超过单次批量插入限制,数据会插入不进去

针对以上问题,拆分list和多线程处理,会很好解决。

整体流程

具体步骤
  • 获取大list
  • 拆分成list
  • 线程池操作小list
具体代码实现
拆分集合的工具类

方式1:效果较差

    public static <T> List<List<T>> spitList0(List<T> source, int length) {long start = System.currentTimeMillis();List<List<T>> result = new ArrayList<>();if (CollectionUtils.isEmpty(source) || length <= 0) {return result;}int size = source.size();if (size <= length) {result.add(source);return result;}List<T> temp = new ArrayList<>();for (int i = 0; i < size; i++) {T index = (i);temp.add(index);int tsize = temp.size();if (tsize % length == 0 && tsize != 0) {result.add(temp);temp = new ArrayList<>();}}if (!CollectionUtils.isEmpty(temp)) {result.add(temp);}System.out.println(System.currentTimeMillis() - start);return result;}

方式2:效果较好

public static <T> List<List<T>> spitList(List<T> source, int length) {long start = System.currentTimeMillis();List<List<T>> result = new ArrayList<>();if (CollectionUtils.isEmpty(source) || length <= 0) {return result;}int size = source.size();if (size <= length) {result.add(source);return result;}while (size > length) {List<T> ts = source.subList(0, length);result.add(ts);List<T> ts1 = source.subList(length, size);source = ts1;size = source.size();}result.add(source);System.out.println(System.currentTimeMillis() - start);return result;}

效果对比

多线程处理list
    @Testpublic void threadMethod() {List<User> totalList = new ArrayList();for (int i = 0; i < 1000; i++) {User us = new User();us.setAge(i);us.setName("zhyang" + i);totalList.add(us);}// 初始化线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 40,5, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.AbortPolicy());// 大集合拆分成N个小集合List<List<User>> lists = spitList(totalList, 100);// 记录单个任务的执行次数CountDownLatch countDownLatch = new CountDownLatch(lists.size());// 对拆分的集合进行批量处理, 先拆分的集合, 再多线程执行for (List<User> singleList : lists) {// 线程池执行ute(new Thread(new Runnable() {@Overridepublic void run() {// 插入数据库的逻辑}}));// 任务个数 - 1, 直至为0时唤醒await()untDown();}try {// 让当前线程处于阻塞状态,直到锁存器计数为零countDownLatch.await();} catch (InterruptedException e) {System.out.println("fail");}// 继续执行}@Data
class User {private String name;private int age;
}

本文发布于:2024-02-04 21:28:38,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170716843559777.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:太慢   多线程   批量   Java   list
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23