Springboot 多线程分批切割处理 大数据量List集合 ,实用示例
前言
哲学提问镇贴:
不了解异步怎么使用的看官, 可阅:
SpringBoot 最简单的使用异步线程案例 @Async_小目标青年的博客-CSDN博客
Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客
想了解更多关于批量list处理操作的看官,可阅:
Java List数据量大, 需要分片批次操作_小目标青年的博客-CSDN博客
Mybatis 批量插入 采用分批处理一次500条_小目标青年的博客-CSDN博客
Springboot 手动分页查询,分批批量插入数据_小目标青年的博客-CSDN博客
正文
话不多说,本篇核心介绍的是日常毕竟常遇到的一些处理点。
首先list数据量大,需要切割操作 :
//模拟拿到的数据量大的listList<Product> products = getBatchListTest();//直接用Lists.partition 按照100条一次切割List<List<Product>> allList = Lists.partition(products, 100);//循环分批处理切割的listfor (List<Product> batchProducts :allList){productService.batchDealList(batchProducts);}
但是往往有时候 数据量是真大,切割完循环处理 还嫌慢 。
是的,因为循环处理是串行的, 也就是,比如500条数据的list,切割成5个 batchList。
如果每次处理一个barchList要1秒钟,那么循环串行处理5次,就是 1X5=5 秒。
所以我们分批切割这样串行处理完,觉得慢, 如果业务场景合适,我们可以试着改 并行 处理。
开袋及食:
① 配置一个线程池,交给spring管理的 线程池,用起来才放心、安心:
ThreadConfig.java
import java.util.concurrent.Executor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync
public class ThreadConfig {/*** 执行需要依赖线程池,这里就来配置一个线程池* @return*/// 当池子大小小于corePoolSize,就新建线程,并处理请求// 当池子大小等于corePoolSize,把请求放入workQueue(QueueCapacity)中,池子里的空闲线程就去workQueue中取任务并处理// 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理// 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁@Bean("MyExecutor")public Executor getExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置核心线程数executor.setCorePoolSize(10);//设置最大线程数executor.setMaxPoolSize(100);//线程池所使用的缓冲队列executor.setQueueCapacity(250);//设置线程名executor.setThreadNamePrefix("JcTest-Async");//设置多余线程等待的时间,单位:秒//executor.setKeepAliveSeconds();// 初始化线程executor.initialize();return executor;}
}
看看我们并行的写法:
@AutowiredThreadConfig threadConfig;@PostMapping("doBatchParallelTes")public void doBatchParallelTes() {List<Product> products = getBatchListTest();List<List<Product>> allList = Lists.partition(products, 100);int batchNum = allList.size();StopWatch stopWatch = new StopWatch();stopWatch.start();Executor threadConfigExecutor = threadConfig.getExecutor();List<CompletableFuture> results = new ArrayList<>();for (List<Product> batchProducts :allList){CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {productService.batchDealList(batchProducts);return "";}, threadConfigExecutor);results.add(future);}CompletableFuture.allOf(results.toArray(results.toArray(new CompletableFuture[batchNum]))).join();stopWatch.stop();System.out.println("总用时"+stopWatch.getTotalTimeMillis()+"毫秒");}
代码简析:
并行图解:
看看执行效果:
那么看到这里,大家一定注意到了那个 ‘合流’ , 是不是每个业务都需要这样所谓的‘合流’?
当然不是,如果说这批list处理完完事了,不需要考虑回到主线程去做其余操作,那么我们就不需要‘合流’操作。
不需要合流,主线程走主线程逻辑,子线程自己玩自己的:
@PostMapping("doBatchTestNew2")public void doBatchTestNew2() {List<Product> products = getBatchListTest();List<List<Product>> allList = Lists.partition(products, 100);StopWatch stopWatch = new StopWatch();stopWatch.start();Executor threadConfigExecutor = threadConfig.getExecutor();for (List<Product> batchProducts :allList){CompletableFuture.runAsync(() -> {productService.batchDealList(batchProducts);}, threadConfigExecutor);}stopWatch.stop();System.out.println("总用时"+stopWatch.getTotalTimeMillis()+"毫秒");}
效果,其实就是异步执行:
那如果说是基于@Async 的方式去实现呢,当然也是可以的,示例:
基于@Async 就不多说了,这个在文章开头有介绍相关文章,之前写的,介绍过玩法,就是这两篇:
SpringBoot 最简单的使用异步线程案例 @Async_小目标青年的博客-CSDN博客
Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客
好了,该篇就到这。
相关文章:
![](https://img-blog.csdnimg.cn/a4a40d27ac344a299da806533fa9ff35.png)
Springboot 多线程分批切割处理 大数据量List集合 ,实用示例
前言 哲学提问镇贴: 不了解异步怎么使用的看官, 可阅: SpringBoot 最简单的使用异步线程案例 Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处…...
![](https://img-blog.csdnimg.cn/4a0475ef69c14c3691e7408b48cca105.png)
SQLMAP工具基础使用
本文用的是kali自带的sqlmap工具 我们通过常用命令来理解sqlmap的基本使用 目录 检测注入 获取敏感信息 获取表 获取表的字段 获取数据 --technique 使用指定的注入方式 使用基于时间的延时注入 支持多种注入检测 默认是全部 注入时使用随机的 HTTP User-Agent 设置超时时间 读…...
![](https://img-blog.csdnimg.cn/6cf9c611360847cdb17376e42a7de3f1.png#pic_center)
初学多线程爬虫
多线程在爬虫中应用非常广泛,对于中大型项目来说很有必要,今天我将以初学者的姿态来完成一个简单的多线程爬虫程序。 1、如何认识多线程 计算机完成一项或多项任务,往往可以存在很高的并行度:若是多核处理器则天然的可以同时处理…...
![](https://www.ngui.cc/images/no-images.jpg)
python-实验报告-3
1、编写程序,用户输入一个五位整数,输出其千位和十位数字之和。 num int(input()) # 12345 s1 (num//1000)%10 s2 (num//10)%10sum s1 s2 print(sum)心得: 首先,程序通过 input() 函数获取用户输入的整数,保存在…...
![](https://img-blog.csdnimg.cn/img_convert/44ea0de90ac9050de0ae946afdeccb29.png)
00_托管网站在Tor网络上_Ubuntu主机
title: 托管网站在Tor网络上 urlname: 00_托管网站在Tor网络上_Ubuntu主机 date: 2017-04-24 03:03:03 tags: 小技巧 categories: [小技巧] 托管网站在Tor网络上(Ubuntu主机)https://www.t00ls.net/thread-44040-1-1.html 大部分人接触Tor网络是由Tor …...
![](https://www.ngui.cc/images/no-images.jpg)
个人练习-Leetcode-659. Split Array into Consecutive Subsequences
题目链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences/ 题目大意:给出一个非递减数列nums[],判断其是否能被分割成若干个满足以下条件的子列: 长度大于等于3元素严格递增且只相差1 子列的含义是&…...
![](https://www.ngui.cc/images/no-images.jpg)
OTA升级差分包签名
制作差分包时添加-k <key_path>参数 ./build/tools/releasetools/ota_from_target_files -k <key_path> -i old.zip new.zip update.zip<key_path>如何取值?查看ProjectConfig.mk 如果MTK_SIGNATURE_CUSTOMIZATIONyes并且MTK_INTERNALno…...
![](https://img-blog.csdnimg.cn/db132ab3a411401aa43ff3b32887e04d.png)
使用Buildroot制作根文件系统
寒暄几句 学习了uboot、内核、busybox根文件系统,想着做一个音频播放器。最后发现好像busybox好像没有带aplay架构,这就很麻烦需要自己移植。为了简便我就找大佬沟通了一下,大佬推荐了Buildroot工具来制作根文件系统。 平台 开发板&#x…...
![](https://img-blog.csdnimg.cn/04c5996590624fc79f9efd01935ce710.png)
Java_Spring:5. 基于注解的 IOC 配置
目录 1 环境搭建 1.1 第一步:拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步:使用Component 注解配置管理的资源 1.3 第三步:创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...
![](https://www.ngui.cc/images/no-images.jpg)
Git下的.gitignore文件
.gitignore .gitignore是一个文件,这个文件用来指定哪些文件提交到 git 管理,也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可,指定文…...
![](https://img-blog.csdnimg.cn/5c38b2927e6c42a184f1f35747633d94.gif)
Unity集成GPT
GPT想必是最近互联网最火的话题了,作为一个Unity开发者,今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥,如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查…...
![](https://www.ngui.cc/images/no-images.jpg)
Xilinx FPGA Multiboot设计与实现(Spartan-6和Kintex-7为例)
文章目录 1. FPGA固件升级方案2. Golden镜像和Multiboot镜像简介3. ISE环境下实现(XC6SLX9)4. Vivado环境下实现(XC7K325T)5. Golden镜像Header分析6. 参考资料7. 示例工程ISE、Vivado、MicroBlaze系列教程 1. FPGA固件升级方案 FPGA的硬件可编程性给设计带来了很高的灵活…...
![](https://img-blog.csdnimg.cn/58a9d6671e9341dfa1c6208c7c2b827e.png)
14、SpringMVC执行流程
文章目录14、SpringMVC执行流程14.1、SpringMVC常用组件1 DispatcherServlet(前端控制器)2 HandlerMapping(处理器映射器)3 Handler(处理器)4 HandlerAdapter(处理器适配器)5 ViewRe…...
![](https://img-blog.csdnimg.cn/img_convert/be82c0c8d3beaa8bc2f1eb6ddc1d7980.png)
2步搞定拼版!AD通用拼版技巧分享!
你是不是也看过很多拼版教程,一整篇文章全部都是文字说明和各种图示,照着一步步去做,都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具,功能上比较简单,而且菜单没有全部汉化,对于新手来说&…...
![](https://img-blog.csdnimg.cn/c1b5ec18f1fc4ff98fa0c9c007affdd6.png)
再学C语言47:字符串输出
C中有3个用于输出字符串的标准库函数:puts(),fputs(),printf() 一、puts()函数 示例代码: /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...
![](https://img-blog.csdnimg.cn/img_convert/8fc711bed2ca46210a486af1235df893.jpeg)
银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划
如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心,实现知行果合一课程背景: 很多银行都在开展银行数字化转型培训工作,目前存在以下问题急需解决:缺少针对性的银行数字化转型年度培训规划不清楚如…...
![](https://img-blog.csdnimg.cn/c6176df547e5479a9b1018782894adcb.png#pic_center)
RFID技术在物流行业中的应用:优化物流流程,提高效率
随着物流行业的不断发展,如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术,正逐渐被广泛应用于物流行业,帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用…...
![](https://img-blog.csdnimg.cn/1b9d22e2463246c9b1e885c2ffe0a93b.png#pic_center)
安卓机器学习框架学习:Android Neural Networks API (NNAPI)
Android Neural Networks API (NNAPI) 简介: 1、Android Neural Networks API (NNAPI) 是一个 Android C API,在 Android 设备上实现机器学习; 2、NNAPI 旨在为更高层级的机器学习框架(如 TensorFlow Lite 和 Caffe2)…...
![](https://img-blog.csdnimg.cn/img_convert/981a8f7661ac744a7086ac5f7230edea.jpeg)
阿里云GPU服务器收费标准、学生价格及一个小时费用大全
阿里云GPU租用费用价格表,GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...
![](https://img-blog.csdnimg.cn/6190670f49b445189b2c4c600c0e658b.png)
Asp.net core 依赖注入 (带案例以及注释理解)
1.很多朋友不知道什么是依赖注入,接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少组件之间的耦合度。它的核心思想是,将组件之间的依赖关系从…...
![](https://img-blog.csdnimg.cn/6aa685942b77487a82ba2a55ae150914.png#pic_center)
【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
![](https://www.ngui.cc/images/no-images.jpg)
GO实现Redis:GO实现Redis集群(5)
采用一致性hash算法将key分散到不同的节点,客户端可以连接到集群中任意一个节点https://github.com/csgopher/go-redis本文涉及以下文件: consistenthash:实现添加和选择节点方法 standalone_database:单机database client&#x…...
![](https://img-blog.csdnimg.cn/e6a3be496eed4cac965d88fefb01c81c.png)
高阶数据结构之 B树 B+树 B*树
文章目录B树B树节点的设计插入key的过程B树的验证B树的性能分析B树和B*树B树B*树总结B树、B树、B*树B树的应用做索引MySQL索引MyISAMInnoDBB树 在前面几章中我们介绍了AVL树和红黑树,简单复习一下,我们说到原本的二叉搜索树会存在缺陷(不能保…...
![](https://www.ngui.cc/images/no-images.jpg)
CSS3之动画属性
系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录CSS3 中的动画第一步:定义一个动画第二步:执行这个动画第三步:暂停或启动这个动画过渡和动画的区别CSS3 中的动画 CSS3 动画是使元素从一种样式逐渐变化为…...
![](https://img-blog.csdnimg.cn/4f50c1abb68b43e8b2ae8633725332d8.png)
python --Matplotlib详解
安装 pip install matplotlib导包 import matplotlib.pyplot as plt绘制散点图 如果输入的是两个列表,一个表示 x 轴的值,一个表示 y 轴的值,那么就可以在直角坐标系中划出很多个点,然后将这些点用指定的线段连接起来就得到了散…...
![](https://img-blog.csdnimg.cn/a0a3446b1a0840518e64eadbeaa237c5.png)
手机(Android)刷NetHunter安装指南,无需ssh执行kali命令, NetHunter支持的无线网卡列表!
一、安装NetHunter 前提:确保手机已经root,已装上magisk。如果没有root,可用尝试magisk root 后执行此文 1、下载Nethunter:Get Kali | Kali Linux 然后push 到sdcard 里, 2、打开magisk,选择刚刚下好的…...
![](https://img-blog.csdnimg.cn/img_convert/a733a5702327fc375f93fa1a478ed4f0.png)
教育行业ChatGPT的新挑战
随着科技不断发展,AI的水平越来越高,尤其是最近火出圈的ChatGPT不仅仅可以与人类对话,而且还可以为人们提供关于各种信息帮助。 作为一个先进的“聊天”AI,无论是正苦恼,还是只是需要一些关于如何更有效地管理时间的建…...
![](https://img-blog.csdnimg.cn/45106ecd5e924d64aef13e166d2edf32.png)
内存泄漏 定位方法
目录 内存概念 物理内存 虚拟内存 内存泄漏 定位方法和手段 1.MemInFo MemTotal MemFree MemAvailable Cached 2 vmalloc info 3.Kmemleak 算法原理 使用方法 参考文献与链接: 如果你点进这篇文章,那么要么你是一个C\C程序员,…...
![](https://img-blog.csdnimg.cn/5b7ddd74563b40f7bafa176e772df878.png)
es-head插件插入查询以及条件查询(五)
es-head插件插入查询以及条件查询 1.es-head插件页面介绍 页面详细介绍 2.es-head查询语句 2.1.查询索引中的全部数据 curl命令交互,采用GET请求 语法格式: curl -XGET es地址:9200/索引名/_search?pretty [rootelaticsearch ~]# curl -XGET 192…...
![](https://img-blog.csdnimg.cn/4da4b45f53594b8ea153173de60ae110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjIxODk2,size_16,color_FFFFFF,t_70)
安装python教程并解决Python安装完没有Scripts文件夹问题
安装python教程 并解决Python安装完没有Scripts文件夹问题 ** 一背景 **首先要了解这个出现的原因是下载安装的版本问题 系統是32 bit 的版本还是 64bit 的 web-based: 透过网络安装的,就是执行安装后才透过网络下载python executable: 可執行文件的ÿ…...
![](https://upload-images.jianshu.io/upload_images/5640239-055a6bd7e79ad536.png)
政府门户网站建设指导意见/免费查权重工具
随着小程序开发的日益深广,越来越多的业务需求把小程序提上日程,小程序的学习和开发逐渐成为前端开发者必备的技能和核心竞争力,不管是在工作中开发项目,还是储备知识,小程序资源干货总是备受瞩目。 官方指南 官方工具…...
史志办干地情网站建设/搜索网
前提 我们应该把精力放在写Python上,而不是写前端的样式,所以我比较喜欢的就是拿一个模版来改一改,就可以获得一个漂亮的界面,否则,你需要好好的了解了解html和css相关的知识。 版本相关 操作系统:Mac OS…...
![](https://img-blog.csdnimg.cn/20200620124128641.png)
做网站的故意给中病毒/软文推广的优点
文章目录MyBatis-Plus特性快速开始项目整体目录结构数据库准备配置文件简单CRUD通用service源码下载MyBatis-Plus 官网 个人白话解释:简单的CRUD直接通过方法调用,无需多写接口和xml,像jpa那样调用 愿景 我们的愿景是成为 MyBatis 最好的搭档…...
![](https://www.oschina.net/img/hot3.png)
seo整站优化公司/seo网络优化师招聘
2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1、CentOS/Linux 开放80、8080端口或者开放某个端口 注: 修改/etc/sysconfig/iptables配置,可以参考22端口开放特例 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT…...
![](/images/no-images.jpg)
做网站要用什么服务器吗/北京seo怎么优化
系统架构师应具备哪些能力? 我觉得一名优秀的架构师,在设计系统时需要有以下这四项关键能力: 「平衡取舍、预判未来、抽象思维、容错机制」。 1.平衡取舍 一个架构本质上总会有优有劣,它不可能是完美的、普适的,也不…...
![](http://f.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=1723011a49fbfbedd859367a48cb860b/a50f4bfbfbedab644ec3dde5f536afc379311e65.jpg?referer=4a848d2d1d30e92496b3a9015a3c&x=.jpg)
建设旅游网站的价值/网站维护一般都是维护什么
近期项目发现,在使用release发布项目包,图片找不到了,而debug下面又有图片。 后来发现,原来图片被另外一个组件嵌入了。 下面例子展示了组件嵌入和不嵌入图片的区别 <?xml version”1.0″ encoding”utf-8″?> <s:Appl…...