关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法:

测试数据库为mysql!!!

方法一:

 

[java] view plain copy

  1. public static void insert() {  
  2.         // 开时时间  
  3.         Long begin = new Date().getTime();  
  4.         // sql前缀  
  5.         String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES ";  
  6.         try {  
  7.             // 保存sql后缀  
  8.             StringBuffer suffix = new StringBuffer();  
  9.             // 设置事务为非自动提交  
  10.             conn.setAutoCommit(false);  
  11.             // Statement st = conn.createStatement();  
  12.             // 比起st,pst会更好些  
  13.             PreparedStatement pst = conn.prepareStatement("");  
  14.             // 外层循环,总提交事务次数  
  15.             for (int i = 1; i <= 100; i++) {  
  16.                 // 第次提交步长  
  17.                 for (int j = 1; j <= 10000; j++) {  
  18.                     // 构建sql后缀  
  19.                     suffix.append("(" + j * i + ", SYSDATE(), " + i * j  
  20.                             * Math.random() + "),");  
  21.                 }  
  22.                 // 构建完整sql  
  23.                 String sql = prefix + suffix.substring(0, suffix.length() - 1);  
  24.                 // 添加执行sql  
  25.                 pst.addBatch(sql);  
  26.                 // 执行操作  
  27.                 pst.executeBatch();  
  28.                 // 提交事务  
  29.                 conn.commit();  
  30.                 // 清空上一次添加的数据  
  31.                 suffix = new StringBuffer();  
  32.             }  
  33.             // 头等连接  
  34.             pst.close();  
  35.             conn.close();  
  36.         } catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         // 结束时间  
  40.         Long end = new Date().getTime();  
  41.         // 耗时  
  42.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  43.     }  

 

 

输出时间:cast : 23 ms

该方法目前测试是效率最高的方法!

 

 

 

方法二:

 

[java] view plain copy

  1. public static void insertRelease() {  
  2.         Long begin = new Date().getTime();  
  3.         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";  
  4.         try {  
  5.             conn.setAutoCommit(false);  
  6.             PreparedStatement pst = conn.prepareStatement(sql);  
  7.             for (int i = 1; i <= 100; i++) {  
  8.                 for (int k = 1; k <= 10000; k++) {  
  9.                     pst.setLong(1, k * i);  
  10.                     pst.setLong(2, k * i);  
  11.                     pst.addBatch();  
  12.                 }  
  13.                 pst.executeBatch();  
  14.                 conn.commit();  
  15.             }  
  16.             pst.close();  
  17.             conn.close();  
  18.         } catch (SQLException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         Long end = new Date().getTime();  
  22.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  23.     }  

 

注:注释就没有了,和上面类同,下面会有分析!

控制台输出:cast : 111 ms

执行时间是上面方法的5倍!

 

 

方法三:

 

[java] view plain copy

  1. public static void insertBigData(SpringBatchHandler sbh) {  
  2.         Long begin = new Date().getTime();  
  3.         JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();  
  4.         final int count = 10000;  
  5.         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";  
  6.         jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {  
  7.             // 为prepared statement设置参数。这个方法将在整个过程中被调用的次数  
  8.             public void setValues(PreparedStatement pst, int i)  
  9.                     throws SQLException {  
  10.                 pst.setLong(1, i);  
  11.                 pst.setInt(2, i);  
  12.             }  
  13.   
  14.             // 返回更新的结果集条数  
  15.             public int getBatchSize() {  
  16.                 return count;  
  17.             }  
  18.         });  
  19.         Long end = new Date().getTime();  
  20.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  21.     }  


该方法采用的是spring batchUpdate执行,因效率问题,数据量只有1万条!

 

执行时间:cast : 387 ms

 

 

 

 

总结:方法一和方法二很类同,唯一不同的是方法一采用的是“insert into tb (...) values(...),(...)...;”的方式执行插入操作,

方法二则是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式,要不是测试,我也不知道两者差别是如此之大!

当然,这个只是目前的测试,具体执行时间和步长也有很大关系!如过把步长改为100,可能方法就要几分钟了吧,这个可以自己测试哈。。。

方法三网上很推崇,不过,效率大家也都看到了,1万条记录,耗时6分钟,可见其效率并不理想!而且方法三需要配置spring applicationContext环境才能应用!

不过,方法三在ssh/spring-mvc中可用性还是很高的!

 

刚才开始研究大数据方面的问题,以上也只是真实测试的结果,并不一定就是事实,有好的建议,大家请指正,谢谢!

相互学习,才能进步更快!

 

晚点会把源码发上来,大家可以直接去下载测试!

转载于:https://my.oschina.net/u/1018004/blog/1571241

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各个OS关于查看磁盘和wwn号的方法

1,HP-UX几个命令1&#xff09;查看型号&#xff0c;和uname -a差不多model2&#xff09;查看光纤卡信息ioscan -funC fc3) 查看扫描出的磁盘信息ioscan -fucC disk4&#xff09;查看磁盘及其对应的路径ioscan -m dsf5) 查看划分过来的lunioscan -m lun6) 查看磁盘大小diskinfo …

[转载] Java是不是面向对象的程序

参考链接&#xff1a; 为什么Java不是纯粹的面向对象语言 转载自&#xff1a;https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否确实的 “纯面向对象”&#xff1f;让我们深入到Java的世界&#xff0c;试图来证实它。 在我刚开始学习 Java 的前面几…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色&#xff1a;目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色&#xff08;Target)&#xff1a;定义需要实现的目标接口 目标对象角色&#xff08;Adapter)&#xff1a;调用另外一个源对象&#xff0c;并且转换…

[转载] Java之继承

参考链接&#xff1a; Java多重继承 Java之继承 继承是面向对象程序的一个基本特征&#xff0c;通过继承可以实现父子关系&#xff0c;以及代码的复用。通过继承实现的类称为子类&#xff0c;被继承的类称为父类&#xff0c;所有直接或间接被继承的类都称为父类。 Java类体…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎&#xff0c;内存管理方案是其非常重要的模块&#xff1b; Spark的内存可以大体归为两类&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

[转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

参考链接&#xff1a; Java继承类的对象创建 本文发表于2016年6月&#xff0c;写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践&#xff0c;甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说&#xff0c;还是能有很多收获的&#xff0c;大牛轻拍 我们…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

[转载] Java重载、覆盖与构造函数

参考链接&#xff1a; Java中的继承和构造函数 /** * 拷贝构造函数---Copyf t2 new Copyf(t1);就不会在调用默认构造函数了。 * 复制clone和引用 * 重载是在同一个类&#xff08;范围&#xff09;中&#xff0c;覆盖是子类对父类而言。 重载不关心返回值类型。 静态方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

[转载] Java获取一个类继承的父类或者实现的接口的泛型参数

参考链接&#xff1a; Java中的接口和继承 泛型的作用就不多介绍了&#xff0c;如果你想具备架构设计能力&#xff0c;那么熟练使用泛型是必不可少的。 不多说了&#xff0c;先定义泛型父类和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制结构

while(){} do{ }while(); for( 表达式1; 表达式2;表达式3 ){ 语句或语句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[转载] Scala继承与Java的区别

参考链接&#xff1a; Java中将final与继承一起使用 在之前的笔记Java静态属性和方法的继承问题中&#xff0c;通过具体的实验证明&#xff0c;在子类中重写父类的字段时并没有覆盖父类的字段&#xff0c;只是隐藏了父类的字段。而在scala中则不同&#xff0c;scala子类的同名…

Source Map调试压缩后代码

在前端开发过程中&#xff0c;无论是样式还是脚本&#xff0c;运行时的文件可能是压缩后的&#xff0c;那这个时候调试起来就很麻烦。 这个时候&#xff0c;可以使用Source Map文件来优化调试&#xff0c;Source Map是一个信息文件&#xff0c;里面储存着原代码位置信息&#x…

[转载] Python3十大经典错误及解决办法

参考链接&#xff1a; Python中的关键字2 ◆ ◆ ◆ ◆ ◆ 接触了很多Python爱好者&#xff0c;有初学者&#xff0c;亦有转行人。不论大家学习Python的目的是什么&#xff0c;总之&#xff0c;学习Python前期写出来的代码不报错就是极好的。下面&#xff0c;严小样儿为大家罗…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑&#xff0c;最常用的方法是用u盘或移动硬盘等存储设备来拷贝&#xff0c;这样速度慢&#xff0c;而且可能拷贝多次才能将数据拷贝完。现提供一种方法&#xff0c;就是通过windows 的文件共享来实现。通过千兆网线直接连…

[转载] 使用 Web 标准生成 ASP.NET 2.0 Web 站点

参考链接&#xff1a; 使用super访问Java祖父母的成员 Stephen WaltherSuperExpert.com 适用于&#xff1a; Microsoft ASP.NET 2.0 (Beta 2) Microsoft Visual Studio .NET 2005 Microsoft Visual Web Developer 摘要&#xff1a; Microsoft ASP.NET 2.0 具有很多有用的功能…

Office快捷键大全之三(Access快捷键下篇)

向下键 向某帮助主题的末尾滚动 Page Up 以较大增量向某帮助主题的开头滚动 Page Down 以较大增量向某帮助主题的末尾滚动 Home 移到某帮助主题的开头 End 移到某帮助主题的末尾 CtrlP 打印当前帮助主题 CtrlA 选定整个帮助主题 CtrlC 将选定项复制到"剪贴…

[转载] 如何在Android设备之间共享Google Play应用,音乐等

参考链接&#xff1a; 使用super访问Java祖父母的成员 We recently showed you how to configure your iOS devices for app and media sharing; more than a few people wrote in asking how to do the same thing with Google Play purchases. Read on as we dig into how t…

linux 高性能读书笔记之通用socket地址

####socket网络编程接口 socket的地址是结构体sockaddr 代码如下 struct sockaddr{ sa_family_t sa_family; char sa_data[14]; } sa_family 成员是地址族类型&#xff08;sa_family_t)变量。地址族类型通常与协议族类型对应 1.二者对应表 协议族地址表描述PF_UNIXAF_UNIXUNIX本…

[转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

参考链接&#xff1a; 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调用时机:如果你有构造代码块 系统会帮你调用 帮你在创建对象…