java并发执行批量插入

news/2024/7/7 19:00:24

java并发执行批量插入

1、mybatis-plus批量插入

  • long start = System.currentTimeMillis();
            int num = 5000;  //一次批量插入的数量
            int j = 0;
            for (int i = 0;i<20;i++){
                List<User> userList = new ArrayList<>();
                while (true){
                    j++;
                    User user = new User();
                    user.setUserProfile("我是假数据");
                    user.setUsername("假数据");
                    user.setAvatarUrl("https://xxxxxx.jpg");
                    user.setGender(0);
                    user.setUserAccount("jiazzj");
                    user.setUserPassword("2970a1691c8ef07f40ddbe6f7b18662f");
                    user.setPhone("123456789");
                    user.setEmail("123456@qq.com");
                    user.setUserStatus(0);
                    user.setUserRole(0);
                    String[] str = new String[]{"java","考研"};
                    Gson gson = new Gson();
                    String json = gson.toJson(str);
                    user.setTags(json);
                    userList.add(user);
                    if (j % num == 0){
                        break;
                    }
                }
                userService.saveBatch(userList,num);  //mybatis-plus通过传入列表批量插入
            }
            long end = System.currentTimeMillis();
            System.out.println("用时:"+(end - start));
    
  • 用时:6544 ms

2、采用Java并发运行

  • 多线程分析

    • 这里批量插入数据,是 io 密集任务,我们可以分配比 cpu核心数多的线程并发工作
  •     private ExecutorService executorService = new ThreadPoolExecutor(40, 1000, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(2500));
    
    • 分配 40 个线程
    • 最大线程数为 1000
    • 非核心线程闲置超时时间为 :1分钟
    • 任务队列容量为 2500
  • image-20240203111839623

  • 现在MySQL含有20万,准备执行

  •     long start = System.currentTimeMillis();
        int num = 2500;
        int j = 0;
        List<CompletableFuture<Void>> futureList = new ArrayList<>();
        for (int i = 0; i < 40; i++) {
            List<User> userList = new ArrayList<>();
            while (true){
                j++;
                User user = new User();
                user.setUserProfile("我是假数据");
                user.setUsername("假数据");
                user.setAvatarUrl("https://xxxx.jpg");
                user.setGender(0);
                user.setUserAccount("jiazzj");
                user.setUserPassword("2970a1691c8ef07f40ddbe6f7b18662f");
                user.setPhone("123456789");
                user.setEmail("123456@qq.com");
                user.setUserStatus(0);
                user.setUserRole(0);
                String[] str = new String[]{"java","考研"};
                Gson gson = new Gson();
                String json = gson.toJson(str);
                user.setTags(json);
                userList.add(user);
                if (j % num == 0){
                    break;
                }
            }
            //定义一个异步任务进行批量插入
            CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
                System.out.println("线程名" + Thread.currentThread().getName());
                userService.saveBatch(userList, num);
            },executorService);
            //每个任务执行完,放人list列表里
            futureList.add(future);
        }
        //等待线程全部执行完后执行后续操作
        CompletableFuture.allOf(futureList.toArray(new CompletableFuture[]{})).join();
      
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end - start));
    
  • 用时:1889ms,可以看到这里是40个线程并发执行的任务,提升很显著

  • image-20240203112203905

  • image-20240203112302297


http://lihuaxi.xjx100.cn/news/2008480.html

相关文章

【数据结构】单向链表实现 超详细

目录 一. 单链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项&#xff1a;帮助高效记忆和理解 2.链表的基本功能接口 2.0 创建一个 链表 2.1 链表的打印 3.链表的创建新节点接口 4.链表的节点插入功能接口 4.1 尾插接口 4.2 头插接口 4.3 指定位…

了解野指针与assert断言 拿捏指针的使用!

目录 1.野指针 野指针的成因&#xff1a; 2.规避野指针 3.assert断言 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免费的赞哟~ 1.野指针 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的…

Python爬虫的基本原理

我们可以把互联网比作一张大网&#xff0c;而爬虫&#xff08;即网络爬虫&#xff09;便是在网上爬行的蜘蛛。把网的节点比作一个个网页&#xff0c;爬虫爬到这就相当于访问了该页面&#xff0c;获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系&#xff0c;这样…

flowable 设置自定义属性教程

概述 由于工作需要给flowable工作流设计器添加自定义属性&#xff0c;以满足功能实现。所以这篇文章介绍下用flowable 开源的的flowable-ui 前端添加自定义属性&#xff0c;后端解析属性值的例子。 技术栈 序号技术点名称版本1Flowable6.8.0 使用的是flowable6.8.0 版的代码…

七、jsBOM

7.1概念 BOM:浏览器对象模型&#xff08;Browser Object Model),是一个用于访问浏览器和计算机屏幕的对像集合。 我们可以通过全局对象window来访问这些对像. 7.2 BOM相关对象和方法 // window.document 当前页面所载入的文档&#xff0c;它的方法和属性也属于DOM对像所涵盖…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

node环境打包js,webpack和rollup两个打包工具打包,能支持vue

引言 项目中经常用到共用的js&#xff0c;这里就需要用到共用js打包&#xff0c;这篇文章讲解两种打包方式&#xff0c;webpack打包和rollup打包两种方式 1、webpack打包js 1.1 在根目录创建 webpack.config.js&#xff0c;配置如下 const path require(path); module.expo…

YOLOv5改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合模块,在本文的下面均会有讲解,…