多线程快速导入大量数据到mysql

2023-11-13

一、前言

批量导入3w条数据需要一分多钟,最终使用多线程分批导入mysql中,将时间压缩到10s以内。
网上比较好的方法就是下面这种,但是这种方式比较繁琐,我们可以根据自己的情况来优化。

二、多线程分批导入Mysql

@Transactional(rollbackFor = Exception.class)
public int addFreshStudentsNew(List<FreshStudentAndStudentModel> list, String schoolNo) {
        if (list == null || list.isEmpty()) {
            return 0;
        }
        //这里弄三个list来把list的每个对象的字段分开存储,进一步将过大list缩小
        List<StudentEntity> studentEntityList = new LinkedList<>();
        List<EnrollStudentEntity> enrollStudentEntityList = new LinkedList<>();
        List<AllusersEntity> allusersEntityList = new LinkedList<>();
        //这里是循环制造三个list来拆分过大list,根据自己的实际情况看是否拆分
        list.forEach(freshStudentAndStudentModel -> {
            EnrollStudentEntity enrollStudentEntity = new EnrollStudentEntity();
            StudentEntity studentEntity = new StudentEntity();
            BeanUtils.copyProperties(freshStudentAndStudentModel, studentEntity);
            BeanUtils.copyProperties(freshStudentAndStudentModel, enrollStudentEntity);
            String operator = TenancyContext.UserID.get();
            String studentId = BaseUuidUtils.base58Uuid();
            enrollStudentEntity.setId(BaseUuidUtils.base58Uuid());
            enrollStudentEntity.setStudentId(studentId);
            enrollStudentEntity.setIdentityCardId(freshStudentAndStudentModel.getIdCard());
            enrollStudentEntity.setOperator(operator);
            studentEntity.setId(studentId);
            studentEntity.setIdentityCardId(freshStudentAndStudentModel.getIdCard());
            studentEntity.setOperator(operator);
            studentEntityList.add(studentEntity);
            enrollStudentEntityList.add(enrollStudentEntity);

            AllusersEntity allusersEntity = new AllusersEntity();
            allusersEntity.setId(enrollStudentEntity.getId());
            allusersEntity.setUserCode(enrollStudentEntity.getNemtCode());
            allusersEntity.setUserName(enrollStudentEntity.getName());
            allusersEntity.setSchoolNo(schoolNo);
            allusersEntity.setTelNum(enrollStudentEntity.getTelNum());
            allusersEntity.setPassword(enrollStudentEntity.getNemtCode());  //密码设置为考生号
            allusersEntityList.add(allusersEntity);
        });

        //开启50个线程 
        int nThreads = 50;
        //过大list的数据总条数
        int size = enrollStudentEntityList.size();
        //开启一个有50个线程的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
        //通过实现Callback接口,并用Future可以来接收多线程的执行结果
        List<Future<Integer>> futures = new ArrayList<Future<Integer>>(nThreads);
        //遍历生成50个线程来执行任务,每个线程处理50条数据
        for (int i = 0; i < nThreads; i++) {
            final List<EnrollStudentEntity> EnrollStudentEntityImputList = enrollStudentEntityList.subList(size / nThreads * i, size / nThreads * (i + 1));
            final List<StudentEntity> studentEntityImportList = studentEntityList.subList(size / nThreads * i, size / nThreads * (i + 1));
            final List<AllusersEntity> allusersEntityImportList = allusersEntityList.subList(size / nThreads * i, size / nThreads * (i + 1));
           //线程执行,实现callable接口,批量保存
           Callable<Integer> task1 = () -> {
           studentSave.saveStudent(EnrollStudentEntityImputList,studentEntityImportList,allusersEntityImportList);
               return 1;
            };
          //每50条数据提交一次任务,报异常则执行事务回滚,并将结果添加到furures中用于展示
          futures.add(executorService.submit(task1));
        }
        //停止接收新任务,原来的任务继续执行
        executorService.shutdown();
        if (!futures.isEmpty() && futures != null) {
            return 10;
        }
        return -10;
    }

3、Future类详解

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。

原文链接:添加链接描述

4、ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含义和区别

  • ExecutorService 是 Java 提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过 ExecutorService
    创建线程。
  • 使用 ExecutorService 类时,经常用到 shutdown() 、shutdownNow()、awaitTermination() 3个方法,下面我们来说说它们的含义和三者的区别 。

原文链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程快速导入大量数据到mysql 的相关文章

  • JAVA获取IP地址、电脑Mac地址

    1 获取IP地址 注意 IP地址经过多次反向代理后会有多个IP值 其中第一个IP才是真实IP 所以不能通过 request getRemoteAddr 获取IP地址 如果使用了多级反向代理的话 X Forwarded For的值并不止一个
  • android pull 解析xml

    Pull简介 1 常见的XML解析方式有三种 DOM SAX Pull Android系统中推荐使用Pull 2 Pull解析器是一个开源的Java项目 Android系统内部解析XML文件均为此种方式 也可用于JavaEE项目 3 And
  • maven学习总结

    众所周知 maven的两大作用是项目构建和依赖管理 除此之外 基于多模块项目 maven常用的功能还有模块化管理 项目构建 Maven是一个构建工具 可以根据项目中的配置文件 pom xml 来自动执行项目的构建过程 它可以将源代码编译 运
  • Java-String类的常用方法

    Java String类的常用方法 1 常用方法1 int length 返回字符串的长度 return value length char charAt int index 返回某索引处的字符return value index bool
  • idea 配置log4j

    1 导入log4j jar包 放在lib目录下 右键jar包 createlibrary 好像是 还有一种方法 2 配置log4j properties文件 设置输出信息 DEBUG级别和ERROR级别 log4j rootLogger d
  • 【SpringBoot】简介及传统的 Spring 框架:对比和分析

    哈喽 哈喽 大家好 我是你们的老朋友 保护小周 今天给大家带来的是 SpringBoot 的简介 SpringBoot 项目的创建 相较于 Spring 框架的优点 1 快速的集成框架 2 内置运行容器 快速的部署项目 3 摒弃繁琐的 xm
  • javaee之黑马乐优商城4

    商品规格与数据结构 下面来说一下数据库的设计与分析 其实对于spu这张表来说 大体设计还是比较好设计的 看一下下面这张图是一个产品的规格参数 上面主体就是一个规格参数 基本信息又是一个规格参数 这里就是涉及到了一个商品的具体信息 sku就是
  • 黑马头条 热点文章实时计算、kafkaStream

    热点文章 实时计算 1 今日内容 1 1 定时计算与实时计算 1 2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用
  • Java 基础系列(十六) --- Java中模板引擎的使用

    模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3 1 什么是模板引擎 3 2 Thymeleaf 语法 3 3 模板引擎的使用 4 总结 1 关于动态页面的渲染 渲染就是把数据和页面进行结合起来 主要分为服务器渲染和
  • eclipse 环境配置第一个webapp的发布 及jsp代码的执行

    GBK 所有中文操作系统默认的编码 UTF 8 支持识别各个国家的字符 但这样 之前的代码如果用的是GBK编码 则会变成乱码 我们可以建一个新的工作区 新建一个文件夹 存放workspace 选择workspace位置后 等待重启 以后再建
  • Java多线程(四):什么是死锁以及如何解决死锁

    目录 1 什么是死锁 2 死锁产生的原因 3 如何解决死锁问题 3 1 改变环路等待条件 3 2 破坏请求并持有条件 1 什么是死锁 死锁 是指两个或两个以上的进程在执行过程中 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 若无外力作
  • EL表达式向select中赋值

    在使用el表达式的时候 有时需要向select下拉菜单中赋值 可以使用三目运算法进行赋值
  • java前后端传递日期类型不一致的转换问题

    今天在做学生信息的展示时发现展示的日期和数据库中日期不同 本来最开始是用SimpleDateFormat进行转换的 但是转换之后的是字符串类型的 与date类型对不上 所以就上网查了一下 发现可以用 DateTimeFormat和 Json
  • 利用Java EE相关技术实现一个简单的Web聊天室系统

    利用Java EE相关技术实现一个简单的Web聊天室系统 1 编写一个登录页面 登录信息中有用户名和密码 分别用两个按钮来提交和重置登录信息 2 通过请求指派来处理用户提交的登录信息 如果用户名为本小组成员的名字且密码为对应的学号时 跳转到
  • XXX--1.0-SNAPSHOT.jar中没有主清单属性

    一 情况 将项目打包后 启动项目时报 yiqi 1 0 SNAPSHOT jar中没有主清单属性 二 原因 maven项目打包时没有配置主类 缺少plugin配置 三 解决 加上plugin配置
  • JavaEE - 正则表达式、日期时间类、Math、Random、System、Runtime、大数值运算类

    一 正则表达式 用来描述或者匹配一系列符合某个语句规则的字符串 正则表达式定义了字符串的模式 可以用来搜索 编辑或处理文本 正则表达式是由普通字符 例如字符 a 到 z 以及特殊字符 称为 元字符 组成的文字模式 模式描述在搜索文本时要匹配
  • 聊聊long类型装箱和拆箱性能问题

    前言 这个主题主要讨论Java中long类型自己手动装箱和系统自动装箱的性能问题 在Java中 long类型是基本数据类型 Long类型是long的包装类 手动装箱和自动装箱 手动装箱 通过直接调用Long的valueOf方法 将long装
  • 优质全套Spring全套教程

    hello 我是小索奇 这里把Spring全套笔记分享出来哈 便于大家查看 一起加油 Spring 1 Spring简介 1 1 Spring概述 官网地址 Spring Home Spring 是最受欢迎的企业级 Java 应用程序开发框
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone

随机推荐

  • 计算机操作系统面试题

    一 认识汇编语言 汇编的本质是机器语言的助记符号 汇编语言本质就是机器语言 二 CPU的基本组成 PC 程序计数器 记录将要执行的指令的地址 Registers 暂时存储CPU计算需要用到的数据 ALU 寄存器中取到数据 进行运算然后将结果
  • 分布式存储基础知识

    2018 4 26 分布式存储的数据类型有以下三类 非结构化的数据 主要是数据之间的关联系不大 像文本图片之类的数据 结构化的数据 数据之间关联系很大 关系型数据库这种 可以用表进行表示的 半结构化的数据 介于上述两种数据类型之间 数据之间
  • DCMTK解析DICOM汇总

    DICOM头信息示例如下 0002 0000 Group Length VR UL Length 4 Value 184 0002 0001 File Meta Information Version VR OB Length 2 Valu
  • 抖音综合榜单数据爬虫案例

    偶然在抖音创作平台中看到了一系列的排行榜 如热搜榜 热门视频榜 娱乐明星榜 音乐榜等等 网页链接 https creator douyin com billboard home 登陆后可见数据 榜单接口 接口名 类型 链接 热搜榜单 Get
  • SNPP/VIIRS 数据介绍和下载

    SNPP VIIRS 数据介绍和下载 最近刚接触VIIRS卫星数据 用于洪水监测 主要记录VIIRS数据相关资料和数据下载方法 一 VIIRS数据简介 1 NPP卫星系统 NPP National Polar orbiting Partne
  • 一个自动生成卡通头像的工具网站

    1 打开网站 https deepai org machine learning model toonify 2 选择照片 3 上传照片 4 结果
  • flutter 获取屏幕宽度工具类

    import dart ui 工具类 class GlobalUtils static num screenW 0 设备的宽高 static num screenH 0 设备的宽高 static num devicePixelRatio 0
  • 在IE9使用CORS的思路——XDomainRequest

    前端最常用的就是CORS来调用Restful接口 但是IE9却真够侘寂的 连常规的XHR都不能完整支持 于是 动手写一遍IE10以下专属的 XDomainRequest 但是我测试了一下XDomainRequest 它能接收html tex
  • 开始学习Webpack-应用TypeScript,配置热加载和Source Map

    项目初始化 采用TypeScript 我们的版本是 node version v8 5 0 npm version 5 5 1 1 2 3 4 npm版本升级了 因为npm最近带来了新特性 本地会生成package lock json 能
  • python程序实例源代码-python实例-兔子和獾(塔防游戏)附源码

    原文 兔子和獾大战python小游戏 英文 https www raywenderlich com 24252 beginning game programming for teens with python 中文 http blog jo
  • Anaconda使用conda连接网络出现错误

    在进行更新或者其他操作时报网络连接错误如下 CondaHTTPError HTTP None None for url https repo continuum io pkg Elapsed None An HTTP error occur
  • java在线播放_Java实现视频在线播放flv视频

    1 首先使用Idea创建一个Spring Boot项目 2 在application properties文件下加入以下代码 进行DEBUG日志输出 配置pom xml文件 logging日志配置 logging level root WA
  • QT connect函数

    connect是信号与槽的连接函数 调用方法大致分为以下几类 以QPushButton为例 一 信号 槽函数均不带参数 connect button SIGNAL clicked this SLOT onbuttonClicked conn
  • C、C++中对json格式数据的解析和封装

    C 首先需要调库 include
  • Linux配置kdump大小,linux6下kdump的配置

    linux6下kdump的配置 背景知识 kexec是一个快速启动机制 允许通过已经运行的内核的上下文启动一个Linux内核 不需要经过BIOS BIOS可能会消耗很多时间 特别是带有众多数量的外设的大型服务器 这种办法可以为经常启动机器的
  • 竞赛 基于机器视觉的火车票识别系统

    文章目录 0 前言 1 课题意义 课题难点 2 实现方法 2 1 图像预处理 2 2 字符分割 2 3 字符识别 部分实现代码 3 实现效果 最后 0 前言 优质竞赛项目系列 今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖 适
  • 【Linux入门教程】4 用户管理、系统性能分析、系统日志及日志分析、信号机制与信号处理

    Linux用户管理 在Linux中 有三种用户 Root 用户 也称为超级用户 对系统拥有完全的控制权限 超级用户可以不受限制的运行任何命令 Root 用户可以看做是系统管理员 系统用户 系统用户是Linux运行某些程序所必须的用户 例如
  • Linq的使用方法

    Linq Lamdbe 简单的查询 var ss from r in db Am recProScheme select r var ss1 db Am recProScheme 带where的查询 var ss from r in db
  • 万网免费空间php,免费虚拟主机空间

    免费虚拟主机空间 编辑 概述 许多人选择免费虚拟主机搭建自己的网站或Web技术 事实上免费虚拟主机存在很大风险 如果你需要可靠的 安全的 能快速加载服务的 有技术保障支持的服务 建议你准备一些预算 到正规的买可靠的虚拟主机空间 一 什么是免
  • 多线程快速导入大量数据到mysql

    目录 一 前言 二 多线程分批导入Mysql 3 Future类详解 4 ExecutorService 中 shutdown shutdownNow awaitTermination 含义和区别 一 前言 批量导入3w条数据需要一分多钟