首页 > 其他分享 >多线程批量插入数据

多线程批量插入数据

时间:2024-10-15 13:20:05浏览次数:10  
标签:批量 dataList houseReport 插入 Override 多线程 public

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在面试过程中我们经常会被问到多线程的问题。但是在实际工作过程中可能使用的场景不是特别多,在这边给大家提供一个多线程使用的实际场景案例。


一、多线程使用背景

在目前参与的智慧大屏项目中,部分初始数据需要通过 Excel 导入到数据库。最大的一个 Excel 表中有约 100 万条数据,单线程批量插入的时间消耗超过两个小时,这显然不可接受。因此,我们打算通过多线程插入的方式来优化代码。

二、代码实现

1.单线程插入

代码如下:

@Slf4j
public class HouseImportListener extends AnalysisEventListener<HouseImportVo> implements ExcelListener<HouseImportVo> {
    private final HouseReportMapper houseReportMapper;

    private List<HouseReport> dataList = new ArrayList<>();

    public HouseImportListener() {
        this.houseReportMapper = SpringUtils.getBean(HouseReportMapper.class);
    }
	
    @Override
    public void invoke(HouseImportVo houseImportVo, AnalysisContext context) {

        try {
            HouseReport houseReport=new HouseReport();
            houseReport.setContractNumber(houseImportVo.getContractNumber());
            houseReport.setLocation(houseImportVo.getLocation());
            houseReport.setArea(houseImportVo.getArea());
            houseReport.setType(houseImportVo.getType());
            houseReport.setBank(houseImportVo.getBank());
            dataList.add(houseReport);
        } catch (Exception e) {
            log.error("数据转换出错:{}",e.getMessage());
        }
    }
	
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        houseReportMapper.insertBatch(dataList);
    }
	
    @Override
    public ExcelResult<HouseImportVo> getExcelResult() {
        return new ExcelResult<>() {

            @Override
            public String getAnalysis() {
                return "插入数据完成!";
            }

            @Override
            public List<HouseImportVo> getList() {
                return null;
            }

            @Override
            public List<String> getErrorList() {
                return null;
            }
        };
    }
}

2.多线程插入

代码如下(示例):

@Override
public void doAfterAllAnalysed(AnalysisContext context) {
       //大于2000使用多线程插入
       int size = dataList.size();
       if(size>2000){
	       //每批插入1000条
           int num=1000;
           //计算总批次
           int batch=(size+num-1)/num;
           /*
           * 线程池,20代表核心线程数,100代表最大线程数,10代表线程空间时间
			*/
           ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,20,10, TimeUnit.SECONDS,new ArrayBlockingQueue<>(batch));
           //分批循环插入       
           for (int i = 0; i < batch; i++) {
               int start=num*i;
               int end=Math.min((i+1)*num,size);
               List<HouseReport> threadData = dataList.subList(start, end);
               Runnable task=()->{
                   houseReportMapper.insertBatch(threadData);
               };
               threadPoolExecutor.execute(task);
           }
       }else {
           houseReportMapper.insertBatch(dataList);
       }
   }

总结

通过将插入方式修改为多线程之后,插入效率显著提供,可以在20分钟内将100W条数据读取并插入到数据库中。

标签:批量,dataList,houseReport,插入,Override,多线程,public
From: https://blog.csdn.net/yanting_java/article/details/142905953

相关文章

  • windows 文件名批量改小写
    新建批处理FileName.bat文件,内容如下:REM功能:将所在目录下所有的子文件夹和文件名全部改为小写字母REM用法:将本批处理文件复制到要改名的目录下直接运行即可pauseFOR/R%%AIN(.)DOcd%%A&&(FOR/F%%BIN('dir/b/l')DOrename%%B%%B)echo重命名结束pause—......
  • Java常见排序算法-插入排序
    一、算法介绍 插入排序是一种简单且常用的排序算法,它的实现思路是将列表分为已排序和未排序两部分,每次从未排序部分取出一个元素,将它插入到已排序部分的适当位置,最终将列表排序完成。即将未排序的数值直接插入有序的一组数中,使得插入后的这组数还是有序的。二、算法示意图......
  • 单线程与多线程爬虫
    单线程爬虫在执行爬取任务时,程序一次只处理一个任务。这意味着在一个时刻,它只能向一个服务器发送请求,并等待该请求的响应。完成这个请求后,它才会发送下一个请求。单线程爬虫的结构简单,易于理解和实现,但效率较低,特别是在网络延迟较大或需要处理大量数据时。爬虫多为IO密集型程序,......
  • java多线程基础知识速通
     1.线程和进程的区别进程是正在运行的程序实例,每个进程包含了多个线程,每个现场执行不同的任务进程都有自己的内存空间,而一个进程下的线程们则是共享内存空间线程更加轻量,线程上下文切换的成本远低于进程上下文切换的成本 2.并行与并发的区别并行是多核CPU一般执行相应个......
  • 小咖批量剪辑助手款视频批量自动剪辑软件
    小咖批量剪辑助手是一款视频批量自动剪辑软件,具有智能化、批量化、操作简单等特点。该软件适用于自动化处理和生产视频,旨在帮助用户实现批量化生产产品推广视频的功能。三、安装与配置安装步骤:下载程序压缩包:访问官方网站或指定下载地址,下载小咖批量剪辑助手程序压缩包......
  • 电商设计神器来袭!支持批量去背景、抠图、产品白底图等,不用ps,也能轻松搞定!
    做跨境电商的设计师们都知道亚马逊测款是需要用到白底产品图的,请摄影师拍摄成本高,自己一张张手动抠图、换背景,效率低!如果有个小工具,可以帮你一键搞定,你要试试吗?首先Alt+空格快搜索,打开“AI批量去背景”插件,直接把电商产品图或者文件夹拖进来,一次性支持处理30张图片。这里选......
  • 使用 Lua 脚本批量获取制定目录下的所有 Redis 键的值
    /***使用Lua脚本批量获取Redis键的值**@paramprefixRedis中的键列表*@return键对应的值的列表*/public<E>List<E>getAllListValuesByPrefix(Stringprefix,Class<?>classType){//获取所有以给定前缀开头的键Set<String>keys=redisTempl......
  • 【JavaEE】【多线程】synchronized和死锁
    目录一、synchronized详解1.1互斥1.2可重入二、死锁2.1死锁成因2.2避免死锁一、synchronized详解1.1互斥synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象synchronized就会阻塞等待.语法:sy......
  • python中多线程和多进程的区别
    希望在1分钟内完成500架无人机的路径规划任务,而目前A*算法在50架无人机的情况下需要10秒,意味着在不做优化的情况下处理500架无人机将需要大约100秒,超出你的指标要求。提升计算速度是关键。多线程和多进程是常用的加速方案,但它们在Python中的效果存在差异1、多线程Python的标准......
  • cmd批量创建文件和文件夹
    批量创建文件夹在当前文件夹下批量创建文件夹for/l%iin(start,setp,end)domd新建文件夹%istart:起始数字setp:步长end:结束数字md表示创建文件夹在指定路径下批量创建文件夹在D:\test\下创创建编号为2~10的文件夹:for/l%iin(2,1,10)domdD:\test\新建文件......