jdbc批量插入的4种方式【百万条数据插入只需几秒】
mysql数据库准备
#打开数据库test01;
use test01;
#创建表a,表a包含int型的id列、可变长度型的name【长度20个字符】
create table a
(id INT,NAME VARCHAR(20)
);
jar包准备
引入依赖【不知道什么是依赖的可查看Maven的配置与使用】
<dependencies><!--数据库连接依赖引入--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!--单元测试依赖引入--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies>
方式一:普通插入
/*** 方式一* 普通批量插入,直接将插入语句执行多次即可*/@Testpublic void bulkSubmissionTest1() {long start = System.currentTimeMillis();//开始计时【单位:毫秒】Connection conn = jdbcUtils.getConnection();//获取数据库连接String sql = "insert into a(id, name) VALUES (?,null)";PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);//填充sql语句种得占位符ps.execute();//执行sql语句}} catch (SQLException e) {e.printStackTrace();} finally {jdbcUtils.close(conn, ps, null);}//打印耗时【单位:毫秒】System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}
用时:62分钟多
数据库插入结果
方式二:使用批处理插入
/*** 方式二* 在方式一的基础上使用批处理* 使用PreparedStatement ps;的* ps.addBatch(); 将sql语句打包到一个容器中* ps.executeBatch(); 将容器中的sql语句提交* ps.clearBatch(); 清空容器,为下一次打包做准备* 这三个方法实现sql语句打包,累计到一定数量一次提交*/@Testpublic void bulkSubmissionTest2() {long start = System.currentTimeMillis();Connection conn = jdbcUtils.getConnection();//获取数据库连接String sql = "insert into a(id, name) VALUES (?,null)";PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();//将sql语句打包到一个容器中if (i % 500 == 0) {ps.executeBatch();//将容器中的sql语句提交ps.clearBatch();//清空容器,为下一次打包做准备}}//为防止有sql语句漏提交【如i结束时%500!=0的情况】,需再次提交sql语句ps.executeBatch();//将容器中的sql语句提交ps.clearBatch();//清空容器} catch (SQLException e) {e.printStackTrace();} finally {jdbcUtils.close(conn, ps, null);}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}
用时
数据库插入结果
方式一、二总结:到此可以看出其实批处理程序是没有起作用的,为此我们使用方式三
方式三:通过连接配置url设置【&rewriteBatchedStatements=true】
(设置重写批处理语句)
方式三核心语法:【底层就是使用sql自带的语法,(一般插入value建议用于多个行数据的插入,values建议用于单行数据插入,这样效率可以;
来自大佬的测试:sql中value与values的区别)】
insert into a(id, NAME)
VALUE (1, '张三'),(2, '李四'),(3, '王二'),(4, '刘备'),(5, '曹操'),(6,'张飞');
url=jdbc:mysql://localhost:3306/test01?characterEncoding=utf8&serverTimezone=UTC&useSSL=false&rewriteBatchedStatements=true
/*** 方式三* 在方式二的基础上允许重写批量提交语句,获取连接的url需加上* 【&rewriteBatchedStatements=true】(重写批处理语句=是)*/@Testpublic void bulkSubmissionTest3() {long start = System.currentTimeMillis();Connection conn = jdbcUtils.getConnection();//获取数据库连接String sql = "insert into a(id, name) VALUES (?,null)";PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();if (i % 500 == 0) {ps.executeBatch();ps.clearBatch();}}ps.executeBatch();ps.clearBatch();} catch (SQLException e) {e.printStackTrace();} finally {jdbcUtils.close(conn, ps, null);}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}
用时:【10秒左右】
数据库插入结果
到此批处理语句才正是生效
注意
数据库连接的url设置了【&rewriteBatchedStatements=true】时,java代码种的sql语句不能有分号【;】号,否则批处理语句打包就会出现错误,导致后面的sql语句提交出现【BatchUpdateException】异常
异常:【BatchUpdateException】(批量更新异常)
方式四:通过数据库连接取消自动提交,手动提交数据
/*** 方式四* 在方式三的基础上,取消自动提交sql语句,当sql语句都提交了才手动提交sql语句* 需将Connection conn;连接的【conn.setAutoCommit(false)】(设置自动提交=否)*/@Testpublic void bulkSubmissionTest4() {long start = System.currentTimeMillis();Connection conn = jdbcUtils.getConnection();//获取数据库连接String sql = "insert into a(id, name) VALUES (?,null)";PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);conn.setAutoCommit(false);//取消自动提交for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();if (i % 500 == 0) {ps.executeBatch();ps.clearBatch();}}ps.executeBatch();ps.clearBatch();conn.commit();//所有语句都执行完毕后才手动提交sql语句} catch (SQLException e) {e.printStackTrace();} finally {jdbcUtils.close(conn, ps, null);}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}
用时:【4秒左右】
数据库插入结果
总结:
1.注意:这四种方式是层层递进,不可跳过
2.使用批量提交数据,url一定要设置允许重写批量提交【rewriteBatchedStatements=true】,以及此时的sql语句一定不能有分号,否则有【BatchUpdateException】异常,
3.其他的就正常使用PreparedStatement ps;的以下三个方法即可
* ps.addBatch(); 将sql语句打包到一个容器中
* ps.executeBatch(); 将容器中的sql语句提交
* ps.clearBatch(); 清空容器,为下一次打包做准备
4.批量插入不要经常玩【插入的数据占用内存多】
批量插入之前表a只占用1M不到的内存
批量插入4百万条数据后占用100M多内存
jdbc批量插入的4种方式【百万条数据插入只需几秒】相关推荐
- 百万条数据插入mysql_mysql快速插入百万条数据
作者:在赤道吃冰棍儿 www.jianshu.com/p/36b87cb3a05a 前言 假设现在我们要向mysql插入500万条数据,如何实现高效快速的插入进去?暂时不考虑数据的获取.网络I/O.以 ...
- 【SpringBoot项目中使用Mybatis批量插入百万条数据】
SpringBoot项目中使用Mybatis批量插入百万条数据 话不多说,直接上代码,测试原生批处理的效率 开始测试 背景:因为一些业务问题,需要做多数据源,多库批量查询.插入操作,所以就研究了一下. ...
- MySQL十秒插入百万条数据
mysql数据库准备 private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jd ...
- MySQL批量入库的几种方式详解
MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...
- java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式
Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...
- mysql 导入百万级数据 几种 java_百万级数据,如何迁移到MySQL?
最近公司在使用 ABP 重构之前的老项目,数据库也由 SQL SERVER 切换到了 MyQL. 吐槽一下,之前的产品使用的是 Windows Server 2008 , SqlServer 2008 ...
- Spark读取Hive数据的两种方式与保存数据到HDFS
Spark读取Hive数据的两种方式与保存数据到HDFS Spark读取Hive数据的方式主要有两种 1. 通过访问hive metastore的方式,这种方式通过访问hive的metastore元数 ...
- mysql 存储过程查询优化_mysql用存储过程插入百万条数据, 及查询优化
查看所有存储过程: show procedure status; 查看详细存储过程 ptest: show create procedure ptest; 存储过程插入数据: create table ...
- 如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( )
如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( ) A. 通过RIP B. 通过静态路由 C. 通过默认路由 D. 都可以 答案 ...
最新文章
- SAP MM 如何手工修改IDoc的状态?
- 域控服务器发生w32time错误
- java构造方法可以重载吗_Java基础教程之构造器与方法重载
- Java Selenium起步
- sql 截取_如何用 SQL 找一个女朋友?
- ICCV 2021 | 重铸Regression荣光!具有残差对数似然估计的人体姿态回归
- GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
- 前端学习(806):数据类型内存分配
- 规避软件架构风险之反模式
- android webview 长按复制,Android webview 点击或长按有蒙层 – 热爱改变生活
- Scala中的下划线使用总结
- vb调用python函数_vb.net / C# 调用 python
- 《交互设计沉思录》译序
- SQLService2012下载和安装
- 理解 ReadDirectoryChangesW
- 乐乎常用的html源码,点点网关闭自定义html模板代码功能,网易lofter重新映入眼帘...
- FastReport开发指南
- 动态IP与静态ip的区别是什么
- 怎么下载QQ空间或者知乎类似网站上面的视频文件
- 北京自考中心平台登陆方法信息整理