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种方式【百万条数据插入只需几秒】相关推荐

  1. 百万条数据插入mysql_mysql快速插入百万条数据

    作者:在赤道吃冰棍儿 www.jianshu.com/p/36b87cb3a05a 前言 假设现在我们要向mysql插入500万条数据,如何实现高效快速的插入进去?暂时不考虑数据的获取.网络I/O.以 ...

  2. 【SpringBoot项目中使用Mybatis批量插入百万条数据】

    SpringBoot项目中使用Mybatis批量插入百万条数据 话不多说,直接上代码,测试原生批处理的效率 开始测试 背景:因为一些业务问题,需要做多数据源,多库批量查询.插入操作,所以就研究了一下. ...

  3. MySQL十秒插入百万条数据

    mysql数据库准备 private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jd ...

  4. MySQL批量入库的几种方式详解

    MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...

  5. java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式

    Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...

  6. mysql 导入百万级数据 几种 java_百万级数据,如何迁移到MySQL?

    最近公司在使用 ABP 重构之前的老项目,数据库也由 SQL SERVER 切换到了 MyQL. 吐槽一下,之前的产品使用的是 Windows Server 2008 , SqlServer 2008 ...

  7. Spark读取Hive数据的两种方式与保存数据到HDFS

    Spark读取Hive数据的两种方式与保存数据到HDFS Spark读取Hive数据的方式主要有两种 1. 通过访问hive metastore的方式,这种方式通过访问hive的metastore元数 ...

  8. mysql 存储过程查询优化_mysql用存储过程插入百万条数据, 及查询优化

    查看所有存储过程: show procedure status; 查看详细存储过程 ptest: show create procedure ptest; 存储过程插入数据: create table ...

  9. 如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( )

    如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( ) A. 通过RIP B. 通过静态路由 C. 通过默认路由 D. 都可以 答案 ...

最新文章

  1. SAP MM 如何手工修改IDoc的状态?
  2. 域控服务器发生w32time错误
  3. java构造方法可以重载吗_Java基础教程之构造器与方法重载
  4. Java Selenium起步
  5. sql 截取_如何用 SQL 找一个女朋友?
  6. ICCV 2021 | 重铸Regression荣光!具有残差对数似然估计的人体姿态回归
  7. GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
  8. 前端学习(806):数据类型内存分配
  9. 规避软件架构风险之反模式
  10. android webview 长按复制,Android webview 点击或长按有蒙层 – 热爱改变生活
  11. Scala中的下划线使用总结
  12. vb调用python函数_vb.net / C# 调用 python
  13. 《交互设计沉思录》译序
  14. SQLService2012下载和安装
  15. 理解 ReadDirectoryChangesW
  16. 乐乎常用的html源码,点点网关闭自定义html模板代码功能,网易lofter重新映入眼帘...
  17. FastReport开发指南
  18. 动态IP与静态ip的区别是什么
  19. 怎么下载QQ空间或者知乎类似网站上面的视频文件
  20. 北京自考中心平台登陆方法信息整理

热门文章

  1. 怎样恢复文件默认打开方式
  2. 测试ai模糊软件,AE/PR人工智能自动人脸检测马赛克模糊插件
  3. keras构建卷积神经网络
  4. 安卓 获取屏幕坐标(点击屏幕获取坐标)
  5. 递归与lamdba与高阶函数
  6. KF、EKF、UKF的matlab代码实现
  7. 基于强化学习的自我完善聊天机器人
  8. SQL Server高级教程
  9. 最新 PhpStorm 2018 安装及破解方法
  10. OpenGL之常用方法整理