Java 使用线程池和CountDownLatch分批插入或者更新数据

2024-08-24 04:44

本文主要是介绍Java 使用线程池和CountDownLatch分批插入或者更新数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

需求:在开发业务报表时,需要从MySQL数据库读取数据后进行操作,然后写入数据库,使用定时任务跑批。

  分析:①兼顾性能,②  MySQL没有Oracle那么方便、强大的存储过程。综上所述,使用线程池以分批提交的方案把数据插入MySQL数据库,对于更新操作、在Java端进行分页等的操作,本方案也支持。代码如下:

/*** 分页操作数据*/
@Slf4j
@Component
public class BatchDealDemo  {private void batchDeal(List data, int batchNum) throws InterruptedException {int totalNum = data.size();int pageNum = totalNum % batchNum == 0 ? totalNum / batchNum : totalNum / batchNum + 1;ExecutorService executor = Executors.newFixedThreadPool(pageNum);log.info("主线程开始执行 begin --- ");try {CountDownLatch countDownLatch = new CountDownLatch(pageNum);List subData = null;int fromIndex, toIndex;for (int i = 0; i < pageNum; i++) {fromIndex = i * batchNum;toIndex = Math.min(totalNum, fromIndex + batchNum);subData = data.subList(fromIndex, toIndex);ImportTask task = new ImportTask(subData, countDownLatch);executor.execute(task);}// 当前线程必须在执行完任务之后立即调用CountDownLatch.await()方法,// 这样主线程的操作就会被阻塞,直到全部子线程完成各自的任务。//  CountDownLatch类中计数器的值等于0时,主线程就能通过await()方法恢复执行自己的任务。countDownLatch.await();log.info("数据操作完成!可以在此开始主线程的其它业务");log.info("主线程执行完毕 end --- ");} 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;}@Overridepublic void run() {if (null != list) {// 业务逻辑,例如批量insert或者updatelog.info("现在操作的数据是{}", list);}// 发出子线程任务完成的信号countDownLatch.countDown();}}
}

这篇关于Java 使用线程池和CountDownLatch分批插入或者更新数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101483

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比