背景分析

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

maven坐标

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

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

批处理List

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

    public static void main(String[] args) {
List<String> list =new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("Wiener");
batchDealData(list, 3);
batchDealByGuava(list, 3);
} private static void batchDealData (List data, int batchNum) { // commons-collections4
List<List<String>> partitions = ListUtils.partition(data, batchNum);
partitions.stream().forEach(sublist -> {
System.out.println(sublist);
});
}
private static void batchDealByGuava (List data, int batchNum) {
// guava
List<List<String>> partitions = Lists.partition(data, batchNum);
partitions.stream().forEach(sublist -> {
System.out.println(sublist);
});
}

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

private void batchDeal(List<Object> data, int batchNum) throws InterruptedException {
if (CollectionUtils.isEmpty(data)) {
return;
}
// 使用 ListUtils.partition分页
List<List<Object>> newList = ListUtils.partition(data, batchNum);
// 计算总页数
int pageNum = newList.size();
ExecutorService executor = Executors.newFixedThreadPool(pageNum);
try {
CountDownLatch countDownLatch = new CountDownLatch(pageNum);
for (int i = 0; i < pageNum; i++) {
ImportTask task = new ImportTask(newList.get(i), countDownLatch);
executor.execute(task);
}
countDownLatch.await();
log.info("数据操作完成!可以在此开始其它业务");
} finally {
// 关闭线程池,释放资源
executor.shutdown();
}
}
// 无改动
class ImportTask implements Runnable {
private List list;
private CountDownLatch countDownLatch; public ImportTask(List data, CountDownLatch countDownLatch) {
this.list = data;
this.countDownLatch = countDownLatch;
} @Override
public void run() {
if (null != list) {
// 业务逻辑,例如批量insert或者update
log.info("现在操作的数据是{}", list);
}
// 发出线程任务完成的信号
countDownLatch.countDown();
}
}

小结

   你如果对于如何分页不熟练,使用如上分页技术进行处理,是不是很简单?如果你有更轻巧的方法,欢迎留言评论。

Java 使用ListUtils对List分页处理的更多相关文章

  1. 第83节:Java中的学生管理系统分页功能

    第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...

  2. java oracle的2种分页方法

    java oracle的2种分页方法 一物理分页: <!-- 分页查询所有的博客信息 --> <select id="findBlogs" resultType= ...

  3. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  4. Java代码实现 增删查 + 分页——实习第四天

    今天项目内容已经开始了,并且已经完成好多基本操作,今天就开始总结今天学习到的内容,和我遇到的问题,以及分析这其中的原因. 内容模块: 1:Java代码实现对数据库的增删查: 2:分页且获取页面信息: ...

  5. JDBC在Java Web中的应用——分页查询

    分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现 ...

  6. Java项目之查询后分页

    一.Jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  7. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...

  8. Java项目中基于Hibernate分页总结

    1,First of all,  we should have a wrapper class for page,this class can calculate the startRow by th ...

  9. java web 前端页面的分页逻辑

    <div class="divBody"> <div class="divContent"> <!--上一页 --> < ...

  10. 关于Java中List对象的分页思想,按10个或者n个数对list进行分组

    try { List<String> timelist = DateUtils.getDateListBySETime("2015-08-01", "2015 ...

随机推荐

  1. MyCat分库分表-练习

    模拟这样一个场景: 1.将数据库按业务"垂直"拆分成用户库和订单库: 2.用户库做主从,读写分离: 3.订单库做"水平"切分,并且每个分片表做主从,读写分离: ...

  2. 码云git笔记

    以后要日常使用这个东西,所以今天又学习了下,具体链接如下: 码云帮助中心https://gitee.com/help/articles/4122 先记录一点简单的入门东西: Git 全局设置: git ...

  3. nodejs 使用记录

    基本配置 不论是ubuntu还是windows10,对于非安装版的nodejs,在下载后所做的配置: 设置环境变量:NODE_ROOT为nodejs根目录,NODE_PATH为其中node_modul ...

  4. Golang 入门 : 创建第一个Go程序

    创建第一个Go程序 新建一个 helloworld.go 文件,写入以下程序 package main import ( "fmt" ) // 一个函数声明 /* 一个main函数 ...

  5. bs4库爬取天气预报

    Python不仅用于网站开发,数据分析,图像处理,也常用于爬虫技术方向,最近学习了解下,爬虫技术入门一般先使用bs4库,爬取天气预报简单尝试下. 第一步:首先选定目标网站地址 网上查询,天气预报准确率 ...

  6. docker删除所有服务service,停止并删除所有容器container

    查看运行容器docker ps 查看所有容器docker ps -a 进入容器其中字符串为容器ID:docker exec -it d27bd3008ad9 /bin/bash 删除所有服务:dock ...

  7. 探秘Transformer系列之(16)--- 资源占用

    探秘Transformer系列之(16)--- 资源占用 目录 探秘Transformer系列之(16)--- 资源占用 文章总表 0x00 概述 0x01 背景知识 1.1 数据类型 1.2 进制& ...

  8. [每日算法 - 阿里机试] leetcode739. 每日温度

    入口 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer.https://le ...

  9. Windows Terminal 调整默认终端

    Windows Terminal 打开时默认的是 PowerShell, 如下图: 但是, 我希望默认的是更轻快的 cmd... 打开设置 调整 defaultProfile 为 cmd.exe 配置 ...

  10. 《机器人SLAM导航核心技术与实战》先导课:SLAM的应用价值与技术难点

    <机器人SLAM导航核心技术与实战>先导课:SLAM的应用价值与技术难点 视频讲解 [先导课]3.SLAM的应用价值与技术难点-视频讲解 [先导课]3.1.SLAM的应用价值与技术难点-S ...