当前位置: 首页 > news >正文

多线程实现批量保存数据

首先注入

private final SqlSessionFactory sqlSessionFactory;
 private final static int BATCH_SIZE = 200; //保存数据条数
  private final static int THREAD_POOL_SIZE = 15; // 线程池大小

然后把保存的数据根据BATCH_SIZE 切割成多个批次封装起来:

 /**
     * 将数据分成多个批次
     *
     * @param data      原始数据
     * @param batchSize 每批次的大小
     * @return 分片后的数据列表
     */
    public static <T> List<List<T>> splitData(List<T> data, int batchSize) {
        List<List<T>> batches = new ArrayList<>();
        for (int i = 0; i < data.size(); i += batchSize) {
            int end = Math.min(i + batchSize, data.size());
            batches.add(data.subList(i, end));
        }
        return batches;
    }

然后使用多线程方式实现保存数据,此数据不能使用@Transactional方式,只能手动提交

  public void minusTwoFloor(List<DtsDigitalTwinModel> assetsDetailsInfos) {
        List<List<DtsDigitalTwinModel>> twinModelList = splitData(assetsDetailsInfos, BATCH_SIZE);
        // 创建线程池

        ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        // 使用 CountDownLatch 确保所有线程完成后主线程才继续
        CountDownLatch latch = new CountDownLatch(twinModelList.size());
        // 提交任务到线程池
        for (List<DtsDigitalTwinModel> batch : twinModelList) {
            executorService.submit(() -> {
                try (SqlSession sqlSession = sqlSessionFactory.openSession()){
                    //todo 此处写批量保存
                     this.saveBatch(batch);
                    sqlSession.commit();
                } finally {
                    latch.countDown(); // 任务完成,计数器减一
                }
            });
        }
        // 等待所有任务完成
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 关闭线程池
        executorService.shutdown();
        log.info("数据保存完成!");
    }

相关文章:

  • PE,ELF,COFF
  • 基于物联网设计的疫苗冷链物流监测系统
  • 【前端知识】前端构建工具webpack的平替vite
  • 【软件测试】--面试
  • 如何用终端运行一个SpringBoot项目
  • SD ComfyUI工作流 一键Q版盲盒手办形象_多关键词切换
  • 星越L_副驾驶屏使用讲解
  • 每日一题之储存晶体
  • 基于GoogleNet深度学习网络和GEI步态能量提取的步态识别算法matlab仿真,数据库采用CASIA库
  • Linux驱动开发实战(四):设备树点RGB灯
  • Cursor 终极使用指南:从零开始走向AI编程
  • 【算法题解答·六】栈队列堆
  • 剑指 Offer II 073. 狒狒吃香蕉
  • 2025-03-13 禅修-错误的做法
  • 大白话如何在 Vue 项目中进行路由懒加载?
  • DexGraspVLA:面向通用灵巧抓取的视觉-语言-动作框架
  • 便利店商品推荐数字大屏:基于python和streamlit
  • python元组(被捆绑的列表)
  • 【C#学习笔记04】C语言格式化输出
  • 【Linux】线程
  • 南宁做网站开发的公司有哪些/抖音推广方案
  • 大连网站搜索优/宁波seo网络推广
  • 小程序定制开发网站/网络营销策划目的
  • 牡丹江3d网站开发/百度广告商
  • 珠海网站建立/seo薪酬如何
  • 做网上兼职的网站/浙江seo