当前位置:   article > 正文

Java 使用ListUtils对List分页处理

Java 使用ListUtils对List分页处理

背景分析

  工作中,经常遇到需要用Java进行分页处理数据,例如把1000万条Excel数据写入MySQL数据库,如果把这1000w数据一股脑的丢给MySQL,保证把数据库玩完,故需要批量写入,如每批次写入500条。这时候就可以使用ListUtils.partition了。

maven坐标

  commons-collections4和Guava两个jar包的坐标如下:

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-collections4</artifactId>
  4. <version>4.4</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.google.guava</groupId>
  8. <artifactId>guava</artifactId>
  9. <version>31.0.1-jre</version>
  10. </dependency>

批处理List

基于commons-collections4和Guava两个jar包,对java.util.List中海量数据进行分批处理的逻辑如下所示,请求参数都是传入List和每页处理的数据量:

  1. public static void main(String[] args) {
  2. List<String> list =new ArrayList<>();
  3. list.add("a");
  4. list.add("b");
  5. list.add("c");
  6. list.add("d");
  7. list.add("Wiener");
  8. batchDealData(list, 3);
  9. batchDealByGuava(list, 3);
  10. }
  11. private static void batchDealData (List data, int batchNum) {
  12. // commons-collections4
  13. List<List<String>> partitions = ListUtils.partition(data, batchNum);
  14. partitions.stream().forEach(sublist -> {
  15. System.out.println(sublist);
  16. });
  17. }
  18. private static void batchDealByGuava (List data, int batchNum) {
  19. // guava
  20. List<List<String>> partitions = Lists.partition(data, batchNum);
  21. partitions.stream().forEach(sublist -> {
  22. System.out.println(sublist);
  23. });
  24. }

  这种处理方法相对于手动分页,其优点显而易见,既可以降低代码复杂度,又可以提高开发效率。小编在《Java 使用线程池分批插入或者更新数据》中,介绍了一种通用分页方式,略显复杂,下面基于commons-collections4,优化其中的分页策略,代码如下:

  1. private void batchDeal(List<Object> data, int batchNum) throws InterruptedException {
  2. if (CollectionUtils.isEmpty(data)) {
  3. return;
  4. }
  5. // 使用 ListUtils.partition分页
  6. List<List<Object>> newList = ListUtils.partition(data, batchNum);
  7. // 计算总页数
  8. int pageNum = newList.size();
  9. ExecutorService executor = Executors.newFixedThreadPool(pageNum);
  10. try {
  11. CountDownLatch countDownLatch = new CountDownLatch(pageNum);
  12. for (int i = 0; i < pageNum; i++) {
  13. ImportTask task = new ImportTask(newList.get(i), countDownLatch);
  14. executor.execute(task);
  15. }
  16. countDownLatch.await();
  17. log.info("数据操作完成!可以在此开始其它业务");
  18. } finally {
  19. // 关闭线程池,释放资源
  20. executor.shutdown();
  21. }
  22. }
  23. // 无改动
  24. class ImportTask implements Runnable {
  25. private List list;
  26. private CountDownLatch countDownLatch;
  27. public ImportTask(List data, CountDownLatch countDownLatch) {
  28. this.list = data;
  29. this.countDownLatch = countDownLatch;
  30. }
  31. @Override
  32. public void run() {
  33. if (null != list) {
  34. // 业务逻辑,例如批量insert或者update
  35. log.info("现在操作的数据是{}", list);
  36. }
  37. // 发出线程任务完成的信号
  38. countDownLatch.countDown();
  39. }
  40. }

整理自:https://www.cnblogs.com/east7/p/15876727.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1022291
推荐阅读
相关标签
  

闽ICP备14008679号