SpringBoot模拟插入1000000万条数据
一、数据库表准备
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模拟插入1000000万条数据的更多相关文章
- 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!
教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...
- 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
- 使用hibernate在5秒内插入11万条数据,你觉得可能吗?
需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...
- 插入1000万条数据到mysql数据库表
转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...
- Delphi 操作SQL 插入一万条数据 三种方式速度测试
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Oracle 快速插入1000万条数据的实现方式
1.使用dual配合connect by level create table BigTable as select rownum as id from dual connect by level & ...
- PHP实现插入100万条数据优化
第一种方法一条一条执行插入,结果会很慢 <?php header("Content-Type:text/html;charset=utf-8"); date_default_ ...
- MariaDB(MySql)使用储存过程和随机函数插入10万条数据
))default charset =utf8; #定义一个随机切割字符串的函数 delimiter // create function randStr() ) begin ) default 'A ...
- Oracle中插入100万条数据
在做项目的工程中,需要数据库中存在大量的数据进行程序的验证,但是我们又没有数据,这时就需要我们自己手动建一个表,插入大量数据,进行验证. 那么插入大量数据的sql语句如下: insert into E ...
- mysql如何在一张表中插入一万条数据?(用存储过程解决)
写一个存储过程,里面写一个循环,就可以了.主键你现在不是自增的,所以写语句的时候,就Insert到3个字段中. DELIMITER $$ DROP PROCEDURE IF EXISTS `proc_ ...
随机推荐
- 【已解决】MySQL数据库8.0版本 连接失败错误码1251
错误原因: 是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password 解决方式: 1. cmd 进入 ...
- GraphQl in ASP.NET Core
GraphQl in ASP.NET Core https://graphql.cn/ https://graphql-dotnet.github.io/docs/getting-started/ar ...
- 响应式系统reactive system初探
目录 初识响应式系统 什么是响应式系统 响应式系统的四大特点 及时响应性(Responsive) 恢复性(Resilient) 有弹性(Elastic) 消息驱动(Message Driven) 总结 ...
- 多次复制Excel符合要求的数据行:Python批量实现
本文介绍基于Python语言,读取Excel表格文件数据,并基于其中某一列数据的值,将这一数据处于指定范围的那一行加以复制,并将所得结果保存为新的Excel表格文件的方法. 首先,我们来明确一 ...
- vue3 快速入门系列 —— vue3 路由
vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...
- 二、Unity调用Xcode封装方法
1.开始封装Unity调用接口 我们在Xcode中 写的接口需要在extern "C"中(加上extern "C"后,会指示编译器这部分代码按C语言的进行编译) ...
- 基于eTS高效开发HarmonyOS课程类应用
原文:https://mp.weixin.qq.com/s/kU76kB6T1JSqapAfGPGRHQ,点击链接查看更多技术内容. 随着HarmonyOS 3.0 Beta版的发布,API Vers ...
- 动态规划(五)——坐标dp
传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵, 而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了 ...
- 面向切面编程AOP[三](java AnnotationAwareAspectJAutoProxyCreator实现了什么功能)
前言 要查看一个类实现了什么功能,那么查看它继承的接口或者class即可知道,那么其到底继承了什么? 正文 AnnotationAwareAspectJAutoProxyCreator extends ...
- ST语言
CODESYS平台的ST语言笔记 前言: 基于汇川plc软件,底层是CODESYS平台.这回ST语言正儿八经要用 所以要学,做笔记是为了梳理加深基础要点印象,顺便分享交流学习.codesys平台包括汇 ...