线程分批处理数据及MyBatis的批量插入 |
您所在的位置:网站首页 › java多线程分批处理数据 › 线程分批处理数据及MyBatis的批量插入 |
文章目录 一、背景 二、代码实现: 三、分页查询下游批次处理场景 四、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 |