首页 > 其他分享 >SpringBoot模拟插入1000000万条数据

SpringBoot模拟插入1000000万条数据

时间:2023-11-15 16:37:45浏览次数:37  
标签:SpringBoot pageSize int list 1000000 插入 万条 id ###

一、数据库表准备

CREATE TABLE `student` (
  `id` bigint NOT NULL COMMENT '用户id',
  `name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `address` varchar(250) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

二、持久层代码实现

###Mapper方法
/**
 * @Project
 * @Description
 * @Author songwp
 * @Date 2023/9/8 9:29
 **/
@Mapper
public interface StudentMapper extends BaseMapper<Student> {

   int insertSplice(List<Student> students);
}

###Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.songwp.mapper.StudentMapper">

    <insert id="insertSplice">
        insert into student
        (id,name,address) values
        <foreach collection="students" item="entity" separator=",">
            (#{entity.id},
            #{entity.name},
            #{entity.address})
        </foreach>
    </insert>
</mapper>

三、业务层代码实现

###批量插入的具体方法
 /**
     *  批量插入方法
     * @param list 需要处理的数据
     */
    public void batchData(List<Student> list) {
        int count = list.size() - 1;
        int pageSize = 1000; // 每批次插入的数据量
        int threadNum = count / pageSize + 1; // 线程数
        CountDownLatch countDownLatch = new CountDownLatch(threadNum);
        for (int i = 0; i < threadNum; i++) {
            int startIndex = i * pageSize;
            int endIndex = Math.min(count, (i + 1) * pageSize);
            List<Student> subList = list.subList(startIndex, endIndex);
            threadPoolTaskExecutor.execute(() -> {
                DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
                TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
                try {
                    studentMapper.insertSplice(subList);
                    transactionManager.commit(status);
                } catch (Exception e) {
                    transactionManager.rollback(status);
                    throw e;
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

###控制层业务方法
@GetMapping("/batchInsert")
    @ApiOperation("批量插入大数据量的方法验证")
    public void batchInsert2() {
        List<Student> arrayList = new ArrayList<>();
        // 模拟数据
        for (int i = 0; i < 1000000; i++){
            Student student = new Student(i+1,"张三"+i,"陕西西安"+i);
            arrayList.add(student);
        }
        long startTime = System.currentTimeMillis();
        batchData(arrayList);
        long endTime = System.currentTimeMillis();
        System.out.println("模拟插入: "+arrayList.size()+" 条学生数据,总共耗时:" + (endTime - startTime)+"毫秒");
    }

四、插入的结果耗时

 该测试项目已集成Swagger,通过Swagger调用该方法结果如下:

标签:SpringBoot,pageSize,int,list,1000000,插入,万条,id,###
From: https://www.cnblogs.com/songweipeng/p/17834119.html

相关文章

  • springboot~ConfigurableListableBeanFactory和ApplicationContext的使用场景
    在工具类中封装getBean,使用哪个接口来实现实事上,在工具类中,实现BeanFactoryPostProcessor和ApplicationContextAware接口后,使用它们构造方法里的对象ConfigurableListableBeanFactory和ApplicationContext都可以很方便的获取spring容器里的bean,而在实际应用时,还有有些不同的,比如在......
  • SpringBoot 配置文件内容加密
    1.引入pom<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>......
  • SpringBoot和mybatisPlus得核心知识点
    SpringBoot自动配置(Auto-Configuration):SpringBoot核心特性之一是自动配置。它尝试根据项目的依赖和内容推断应用程序应该如何配置。这简化了开发人员的工作,因为他们无需手动配置大量的设置。起步依赖(StarterDependencies):SpringBoot提供了一系列预配置的依赖项,称为“起......
  • SpringBoot整合数据可视化大屏使用
    整合数据可视化大屏是现代化应用程序中的一个重要组成部分,它可以帮助我们更直观地展示和理解大量的数据。在SpringBoot框架中,我们可以使用一些优秀的前端数据可视化库来实现数据可视化大屏,例如ECharts、Highcharts等。本文将详细介绍如何在SpringBoot中整合数据可视化大屏。1......
  • 使用Winsw部署springboot项目
    原文地址:https://blog.csdn.net/weixin_43862767/article/details/120725943使用Winsw部署springboot项目文章目录使用Winsw部署springboot项目前言一、WinSW是什么?二、WinSW下载及使用1.下载2.使用XML配置安装服务后续部署前言之前工作项目部署环境都是使用的Windows服务器,但是w......
  • springboot
    pom.xml文件<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> &l......
  • Spring,SpringMVC,SpringBoot中注解讲解
    目录1Spring和SpringMVC注解1.1SpringMVC注解[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@ExceptionHandler1.1.11@ResponseS......
  • springboot 注解学习之——@SpringBootApplication
    springboot注解学习之——@SpringBootApplicationspringboot版本3.1.5@Inherited//不认识的注解,顺便学习,字面意思:继承@SpringBootConfiguration//字面意思:SpringBoot配置@EnableAutoConfiguration//字面意思:可以自动配置@Inherited它是一个元注解(就是用来声明注解......
  • 214-springboot定时任务@Scheduled
    @Scheduled(fixedDelay=5000)@Scheduled(fixedDelay=5000),是启动后,马上开始第一次执行任务的么?应用启动时,任务会被立即执行。执行完成后,会等待5秒(因为fixedDelay设置为5000毫秒),然后再次执行任务。以后每次执行完任务,都会等待5秒后再次执行。类的注解:@Configuration@Ena......
  • 在linux上部署SpringBoot项目
    部署项目到linux软件安装项目部署1.软件安装1.1软件安装方式在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下:安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压,修改配置即可rpm安装软件已经按照redhat的包管理......