前言
- 开发目的: 提高百万级数据插入效率。
-
采取方案: 利用
ThreadPoolTaskExecutor多线程批量插入。 - 采用技术: springboot2.1.1+mybatisPlus3.0.6+swagger2.5.0+Lombok1.18.4+postgresql+ThreadPoolTaskExecutor等。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
具体实现细节
application-dev.properties添加线程池配置信息
> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:
> * 视频教程:
# 异步线程配置
# 配置核心线程数
async.executor.thread.core_pool_size = 30
# 配置最大线程数
async.executor.thread.max_pool_size = 30
# 配置队列大小
async.executor.thread.queue_capacity = 99988
# 配置线程池中的线程的名称前缀
async.executor.thread.name.prefix = async-importDB-
spring容器注入线程池bean对象
@Configuration
@EnableAsync
@Slf4j
publicclassExecutorConfig{
@Value("${async.executor.thread.core_pool_size}")
privateintcorePoolSize;
@Value("${async.executor.thread.max_pool_size}")
privateintmaxPoolSize;
@Value("${async.executor.thread.queue_capacity}")
privateintqueueCapacity;
@Value("${async.executor.thread.name.prefix}")
privateStringnamePrefix;
@Bean(name="asyncServiceExecutor")
publicExecutorasyncServiceExecutor(){
log.warn("startasyncServiceExecutor");
//在这里修改
ThreadPoolTaskExecutorexecutor=newVisiableThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(corePoolSize);
//配置最大线程数
executor.setMaxPoolSize(maxPoolSize);
//配置队列大小
executor.setQueueCapacity(queueCapacity);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix(namePrefix);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
returnexecutor;
}
}
创建异步线程 业务类
@Service
@Slf4j
publicclassAsyncServiceImplimplementsAsyncService{
@Override
@Async("asyncServiceExecutor")
publicvoidexecuteAsync(ListlogOutputResults,LogOutputResultMapperlogOutputResultMapper,CountDownLatchcountDownLatch) {
try{
log.warn("startexecuteAsync");
//异步线程要做的事情
logOutputResultMapper.addLogOutputResultBatch(logOutputResults);
log.warn("endexecuteAsync");
}finally{
countDownLatch.countDown();//很关键,无论上面程序是否异常必须执行countDown,否则await无法释放
}
}
}
创建多线程批量插入具体业务方法
@Override
publicinttestMultiThread(){
ListlogOutputResults=getTestData();
//测试每100条数据插入开一个线程
List>lists=ConvertHandler.splitList(logOutputResults,100);
CountDownLatchcountDownLatch=newCountDownLatch(lists.size());
for(ListlistSub:lists){
asyncService.executeAsync(listSub,logOutputResultMapper,countDownLatch);
}
try{
countDownLatch.await();//保证之前的所有的线程都执行完成,才会走下面的;
//这样就可以在下面拿到所有线程执行完的集合结果
}catch(Exceptione){
log.error("阻塞异常:"+e.getMessage());
}
returnlogOutputResults.size();
}
模拟2000003 条数据进行测试

多线程 测试 2000003 耗时如下:耗时1.67分钟


本次开启30个线程,截图如下:

单线程测试2000003 耗时如下:耗时5.75分钟


检查多线程入库的数据,检查是否存在重复入库的问题:
根据id分组,查看是否有id重复的数据,通过sql语句检查,没有发现重复入库的问题

检查数据完整性:通过sql语句查询,多线程录入数据完整

测试结果
不同线程数测试:


总结
通过以上测试案列,同样是导入2000003 条数据,多线程耗时1.67分钟,单线程耗时5.75分钟。通过对不同线程数的测试,发现不是线程数越多越好,具体多少合适,网上有一个不成文的算法:
CPU核心数量*2 +2 个线程。
附:测试电脑配置

审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
SQL
+关注
关注
1文章
807浏览量
46928 -
多线程
+关注
关注
0文章
279浏览量
21124 -
spring
+关注
关注
0文章
341浏览量
16053 -
SpringBoot
+关注
关注
0文章
178浏览量
712
原文标题:性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
如何利用SPI数据实时反馈调整锡膏印刷参数?
利用SPI(锡膏检测系统)数据实时反馈调整锡膏印刷参数,可通过构建“检测-分析-调整”闭环系统实现,其核心在于以SPI的三维测量数据为基准,结合工艺优化算法动态修正印刷机参数,具体实施路径如下:
实测大电流功率电感 SER2918:国产扁平线电感,对比国产巨头线艺如何?
实测国产SER电感,数据与TDK对比,实际工况表现究竟能否替代进口料?本次结合实测数据,客观分析这款国产扁平线电感的真实实力。
工业级板载存储新选择:创世 SD NAND 实测
2.2自研控制器与Flash管理算法
2.2.1、自研控制器优势
2.2.2、四大Flash管理算法
2.3、与同类产品对比:稳省快的平衡之选
三、芯片实测表现
3.1、测试写入读回速度
发表于 03-17 18:14
电机如何区分级数
电机级数是电机设计中的重要参数,直接关系到电机的转速、扭矩和功率特性。理解电机级数的区分方法,不仅有助于正确选型,还能为设备匹配和故障诊断提供依据。本文将从原理、识别方法和应用场景三个维度系统解析电机级数的核心知识。
中软国际中标国际金融巨头千万级数据平台建设项目
近年来,中软国际金融业务集团持续深化港澳及海外市场的布局,不断拓展国际合作。近期,公司成功中标某头部国际信用卡清算机构的千万级数据平台建设项目,不仅是中软国际与该金融机构的首次深度携手,也标志着其在外资金融客户软硬件集成与数据解决方案开发实施服务方面实现重要突破。
固件烧录速度实测:JTAG比UART快6.8倍
在批量生产场景中,固件烧录效率直接影响产线节拍与交付能力。如何选择最优烧录方式?本文以ZLG致远电子MR6450系列核心板为例,通过实测数据为您解析。MR6450核心板MR6450是ZLG致远电子
超声波风速传感器硬核评测:精度 / 响应速度 / 功耗数据实测
级超声波风速传感器,围绕精度、响应速度、功耗三大核心指标展开实测,用真实数据为电子发烧友、工程师提供选型参考。 一、测试准备:标准设备与环境搭建 1. 测试对象 选取市面主流工业级超声波风速传感器(型号:RS-CFS-FX
某化工企业实测:30 天部署采集系统,数据同步零延迟
数据采集是化工企业数字化转型的关键第一步,这套30天部署、零延迟运行的实测方案,以高可靠性提供可复制路径。当设备数据实现“即时感知、分析、应用”,化工生产的安全与效率将实现质的飞跃。
如何使用SpringBoot、Vue2.0、MySQL开发一套云诊所系统?
SpringBoot是Java领域非常流行的快速开发框架,提供了丰富的生态和自动化配置,适合构建微服务和单体应用。 它可以很好地处理业务逻辑、数据持久化、安全性(Spring Security)和API接口
Flutter 移动端开发:集成淘宝 API 实现商品数据实时展示 APP
在电商蓬勃发展的当下,移动端购物成为主流趋势。对于开发者而言,利用 Flutter 构建一个能够实时展示淘宝商品数据的 APP,既能满足用户便捷获取商品信息的需求,也能为电商业务拓展新的渠道
RK3506开发板Xenomai内核RT-Linux实时性系统适配教程与性能实测,实测仅7μs稳定延时
本文基于触觉智能RK3506核心板/开发板,介绍Xenomai内核RT-Linux实时性系统适配,并附性能实测。简介与实测数据Xenomai简介XEnomai是一个实时子系统,可与Linux内核紧密集成,为应用程序提供可预测的响
复杂装备研发设计中利用数据实现大规模个性化定制
在复杂装备研发设计中,利用数据实现大规模个性化定制已成为提升企业竞争力、满足多样化市场需求的关键路径。其核心在于通过数据驱动的个性化需求识别、模块化设计、柔性生产、智能决策及闭环反馈,实现高标准满足
SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
评论