当前位置: 首页 > news >正文

13 秒插入 30 万条数据,批量插入!

数据库表

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',`username` varchar(64) DEFAULT NULL COMMENT '用户名称',`age` int(4) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

User实体

/*** <p>用户实体</p>** @Author Jacky*/
@Data
public class User {private int id;private String username;private int age;}

mapper接口

public interface UserMapper {/*** 批量插入用户* @param userList*/void batchInsertUser(@Param("list") List<User> userList);}

mapper.xml文件

<!-- 批量插入用户信息 -->
<insert id="batchInsertUser" parameterType="java.util.List">insert into t_user(username,age) values<foreach collection="list" item="item" index="index" separator=",">(#{item.username},#{item.age})</foreach>
</insert>

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--通过properties标签加载外部properties文件--><properties resource="jdbc.properties"></properties><!--自定义别名--><typeAliases><typeAlias type="com.zjq.domain.User" alias="user"></typeAlias></typeAliases><!--数据源环境--><environments default="developement"><environment id="developement"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射文件--><mappers><mapper resource="com/zjq/mapper/UserMapper.xml"></mapper></mappers></configuration>
/*** 分批次批量插入一* @throws IOException*/
@Test
public void testBatchInsertUser() throws IOException {InputStream resourceAsStream =Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession session = sqlSessionFactory.openSession();System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();int waitTime = 10;try {List<User> userList = new ArrayList<>();for (int i = 1; i <= 300000; i++) {User user = new User();user.setId(i);user.setUsername("共饮一杯无 " + i);user.setAge((int) (Math.random() * 100));userList.add(user);if (i % 1000 == 0) {session.insert("batchInsertUser", userList);// 每 1000 条数据提交一次事务session.commit();userList.clear();// 等待一段时间Thread.sleep(waitTime * 1000);}}// 最后插入剩余的数据if(!CollectionUtils.isEmpty(userList)) {session.insert("batchInsertUser", userList);session.commit();}long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (Exception e) {e.printStackTrace();} finally {session.close();}
}
/*** 分批次批量插入二* @throws IOException*/
@Test
public void testBatchInsertUser() throws IOException {InputStream resourceAsStream =Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession session = sqlSessionFactory.openSession();System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();int waitTime = 10;try {List<User> userList = new ArrayList<>();for (int i = 1; i <= 300000; i++) {User user = new User();user.setId(i);user.setUsername("共饮一杯无 " + i);user.setAge((int) (Math.random() * 100));userList.add(user);if (i % 1000 == 0) {session.insert("batchInsertUser", userList);// 每 1000 条数据提交一次事务session.commit();userList.clear();}}// 最后插入剩余的数据if(!CollectionUtils.isEmpty(userList)) {session.insert("batchInsertUser", userList);session.commit();}long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (Exception e) {e.printStackTrace();} finally {session.close();}
}
/*** JDBC分批次批量插入* @throws IOException*/
@Test
public void testJDBCBatchInsertUser() throws IOException {Connection connection = null;PreparedStatement preparedStatement = null;String databaseURL = "jdbc:mysql://localhost:3306/test";String user = "root";String password = "root";try {connection = DriverManager.getConnection(databaseURL, user, password);// 关闭自动提交事务,改为手动提交connection.setAutoCommit(false);System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();String sqlInsert = "INSERT INTO t_user ( username, age) VALUES ( ?, ?)";preparedStatement = connection.prepareStatement(sqlInsert);Random random = new Random();for (int i = 1; i <= 300000; i++) {preparedStatement.setString(1, "共饮一杯无 " + i);preparedStatement.setInt(2, random.nextInt(100));// 添加到批处理中preparedStatement.addBatch();if (i % 1000 == 0) {// 每1000条数据提交一次preparedStatement.executeBatch();connection.commit();System.out.println("成功插入第 "+ i+" 条数据");}}// 处理剩余的数据preparedStatement.executeBatch();connection.commit();long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (SQLException e) {System.out.println("Error: " + e.getMessage());} finally {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

http://www.lryc.cn/news/135614.html

相关文章:

  • Nginx代理转发地址不正确问题
  • HyperMotion高度自动化云迁移至华为HCS8.1解决方案
  • pbootcms系统安全防护设置大全
  • 【环境】docker时间与宿主同步
  • 亮点!视频云存储/安防监控视频智能分析平台睡岗离岗检测
  • 编程锦囊妙计——快速创建本地Mock服务
  • 简单认识镜像底层原理详解和基于Docker file创建镜像
  • 加速乐(__jsl_clearance_s)动态cookie生成分析实战
  • 启动Vue项目踩坑记录
  • vue-pc上传优化-uni-app上传优化
  • 【计算机视觉|生成对抗】StackGAN:使用堆叠生成对抗网络进行文本到照片逼真图像合成
  • 跟随角色镜头时,解决地图黑线/白线缝隙的三种方案
  • redis7高级篇2 redis的BigKey的处理
  • 启英泰伦通话降噪方案,采用深度学习降噪算法,让通话更清晰
  • 将SonarLint集成到Git
  • 【Jenkins】rpm方式安装Jenkins(2.401,jdk版本17)
  • vue3跳转统一页面,path一样,传递的参数不一样时页面不刷新
  • 升级还是不升级?iPhone 15和iPhone 14 Plus性能比较
  • 关于LED电子显示屏幕的显示功能
  • 计算机视觉--利用HSV和YIQ颜色空间处理图像噪声
  • Android Studio中引入MagicIndicator
  • webrtc学习(六)重要信令级时序图
  • Leetcode刷题笔记--Hot21-30
  • 【MyBatis八股】MyBatis面试题
  • Apache Hudi初探(二)(与flink的结合)--flink写hudi的操作(JobManager端的提交操作)
  • Office ---- excel ---- 怎么批量设置行高
  • Wlan——STA上线流程与802.11MAC帧讲解
  • HTTP的并发连接限制和连接线程池
  • 【从零学习python 】45.Python中的类方法和静态方法
  • 基于 VisualFoxPro 环境开发应用程序的过程