JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。 
我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试

  • 方法一,使用PreparedStatement加批量的方法
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(o_url, userName, password);
conn.setAutoCommit(false);
String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";
PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
for(int x = 0; x < size; x++){
prest.setString(1, "192.168.1.1");
prest.setString(2, "localhost");
prest.setString(3, "20081009");
prest.setInt(4, 8);
prest.setString(5, "11111111");
prest.addBatch();
}
prest.executeBatch();
conn.commit();
conn.close();
} catch (SQLException ex) {
Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);
}

说明下在建Statement的时候,后面两个参数的意义: 
第一个参数指定 ResultSet 的类型。其选项有: 
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。 
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。 
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。 
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有: 
CONCUR_READ_ONLY:这是缺省值,指定不可以更新 
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

  • 方法二 使用Statement加批量的方法
conn.setAutoCommit(false);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
for(int x = 0; x < size; x++){
stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");
}
stmt.executeBatch();
conn.commit();
  • 方法三:直接使用Statement

使用上述方法分别插入10万条数据的平均测试时间为: 
方法一:17.844
方法二:18.421
方法三:16.359s

可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。

在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。

 conn.setAutoCommit(false)  

个人觉得第一种方法是最方便最实用的。

转自:http://superjavason.iteye.com/blog/255423

最新文章

  1. 【转载】UVa 11464 Even Parity 偶数矩阵
  2. 在ubuntu中为navicat创建快捷方式
  3. centos5.5get 递归下载整个网站
  4. js 计算月/周的第一天和最后一天
  5. 【PowerOJ1738】最小路径覆盖
  6. BBS论坛(二十五)
  7. docker安装与卸载
  8. MySQL报1130错误解决办法
  9. linux服务器启动报错UNEXPECTED INCONSISTENCY解决方法
  10. iOS响应链原理
  11. 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰
  12. 使用 Project Siena 生成一个 Windows Store 应用
  13. spring-boot-CommandLineRunner
  14. Unix环境高级编程(十一)线程
  15. Android NDK 导出独立工具链
  16. The goal you specified requires a project to execute but there is no POM in this directory
  17. 【BZOJ1458】【洛谷4311】士兵占领(网络流)
  18. 如何将Emmet(ZenCoding)安装到到Dreamweaver8?
  19. MVC中输入的保护验证用:HttpServerUtility.HtmlEncode
  20. python——二进制/十进制等转换

热门文章

  1. Linux/Android 性能优化工具 perf
  2. PHP中括号“{}”的3个作用
  3. .htaccess 文件的使用
  4. Kyoto Cabinet(DBM) + Kyoto Tycoon(网络层)
  5. gcc-4.8.3安装,gdb-7.6安装
  6. 编辑时snapping的添加
  7. 常用的Oracle数据库语句 (待更新完毕)
  8. Android FrameWork——相关内容
  9. Java 设计模式学习总结(下)
  10. selenium python (一) 开发环境搭建