线程分批处理数据及MyBatis的批量插入

您所在的位置:网站首页 java多线程分批处理数据 线程分批处理数据及MyBatis的批量插入

线程分批处理数据及MyBatis的批量插入

2024-07-16 12:22| 来源: 网络整理| 查看: 265

文章目录 一、背景 二、代码实现: 三、分页查询下游批次处理场景 四、MyBatis的批量插入 1、活动表简单表结构: 2、业务层组装数据:

一、背景 数据量较多时,我们常常遇到需要分批处理的情况,比如上千上万数据需要需要操作数据库时(入库或者更新),我们想到分批处理,或者解析文件数据量较多,我们可能多线程分批处理,每个线程执行一定的批次数据等… 不管何种场景,当我们想到分批处理时,那如何分批,怎么计算批次数呢?

tip:此处以小数据量为例:假设待处理数据总条数75,每10条数据一处理

我常用的方法总结两种供参考:

方法一:循环遍历待处理的处理,当到达待处理的批次或批次倍数,或最后不足一次剩余的,满足条件即执行一次分批处理操作。eg:10,20,30…7 方法二:根据总数计算总批次数(75/10+1=8次),每次从待处理数据集中截取要处理的数据,最后一个批次特殊处理。eg:0-9,10-19…70-74

二、代码实现:

public static void main(String[] args) { List sourList = new ArrayList(); //1、将list中放进去75个数据--模拟待处理数据集 for (int i = 0; i < 75; i++) { sourList.add(i); } //假设每N个(10个)数据一处理(实际应用中可能每N个开一个线程,或者每N个调一次数据库操作) int batchSize = 10; //tempList存放批次数据 List tempList = new ArrayList(); //方法一:循环遍历待处理的处理(可能多线程,可能分批次入数据库,总之需要按每次处理的大小,计算需要处理的批次数) for (int i = 0; i < sourList.size(); i++) { tempList.add(sourList.get(i)); //判断批次,够N个数开始处理一波 if ((i + 1) % batchSize == 0 || (i + 1) == sourList.size()) { log.info("处理数据集:{}", tempList.toString()); //todo 你的线程处理,或者数据库操作等 tempList.clear(); } } log.info("************* 方法一结束 *************"); //方法二:根据总数计算总批次数,每次从待处理数据集中截取要处理的数据 int count = sourList.size(); int totalPages = (count % batchSize > 0) ? (count / batchSize + 1) : (count / batchSize); log.info("待处理数据总条数:{},总批次数:{}", count, totalPages); int startIndex = 0; int endIndex = 0; if (totalPages > 0) { //循环批次数,计算待处理数据下标 for (int pageNum = 1; pageNum 1) { for (int pageNum = 2; pageNum 1) { for (int pageNum = 2; pageNum


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3