本文部分转载于:http://blog.itpub.net/29254281/viewspace-1151785/

http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html  (这篇文章作者用的mysql驱动是5.1.12)

一. JDBC的批量插入

1.Mysql的驱动jar包选择(重要)

使用MySQL的Batch批量处理,驱动jar包版本需要5.1.13或以上  我使用的驱动版本:mysql-connector-java-5.1.18-bin  (一开始我忽略掉这个jar包的条件要求了,使用的是mysql-connector-java-5.1.6-bin.jar在批处理插入时候效率和普通一样)

2.测试表结构

测试表结构如下:
CREATE TABLE test (
  id int(11) DEFAULT NULL,
  name varchar(20) DEFAULT NULL
) ENGINE=InnoDB 

3.首先使用普通的方式插入100万条数据,使用时间154901毫秒

程序如下:

     public static void generalInsert() throws ClassNotFoundException,SQLException{
long start = System.currentTimeMillis();
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/kxh", "root", "root"); connection.setAutoCommit(false);
PreparedStatement cmd = connection
.prepareStatement("insert into test values(?,?)"); for (int i = 0; i < 1000000; i++) {
cmd.setInt(1, i);
cmd.setString(2, "test");
cmd.executeUpdate();
}
connection.commit(); cmd.close();
connection.close(); long end = System.currentTimeMillis();
System.out.println(end - start);//158918毫秒
}

4.使用批量处理100万条数据,仅用24675毫秒,提升效果非常明显,提升了6倍多.

程序如下:

     public static void batchInsert() throws ClassNotFoundException, SQLException{
long start = System.currentTimeMillis();
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/kxh?useServerPrepStmts=false&rewriteBatchedStatements=true",
"root", "root"); connection.setAutoCommit(false);
PreparedStatement cmd = connection
.prepareStatement("insert into test1 values(?,?)"); for (int i = 0; i < 1000000; i++) {//100万条数据
cmd.setInt(1, i);
cmd.setString(2, "test");
cmd.addBatch();
if(i%1000==0){
cmd.executeBatch();
}
}
cmd.executeBatch();
connection.commit(); cmd.close();
connection.close(); long end = System.currentTimeMillis(); System.out.println("批量插入需要时间:"+(end - start)); //批量插入需要时间:24675
}

MySQL 的驱动jar包在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

与Oracle不同的是,Mysql需要添加rewriteBatchedStatements=true的参数,才可以使用批量处理,否则还是使用逐条处理的方式。另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。

通过试验结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句

5.开启Myslq的查询日志

①批量插入的日志:

开启MySQL的查询日志general_log(关于如何打开,查看mysql的日志请查看博客:http://www.cnblogs.com/DreamDrive/p/5761005.html),发现如下SQL
INSERT INTO test  
VALUES (11, 'test'), (12, 'test'), (13, 'test')......


上下两行的id号码正好相差1000,也就是代码中设置的每1000次提交一次批处理.

②普通插入对应的日志:

如果使用普通的插入打印日志如下:

相对Oracle的批量处理,MySQL需要JDBC参数显式开启,并且对于JDBC驱动的版本也有要求。

 参数useServerPrepStmts=false,如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.

 

JDBC的批量批量插入的更多相关文章

  1. JMeter 利用Jmeter批量数据库插入数据

    利用Jmeter批量数据库插入数据   by:授客 QQ:1033553122 1.   启动Jmeter 2.   添加 DBC Connection Configuration 右键线程组-> ...

  2. JDBC 复习4 批量执行SQL

    1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbe ...

  3. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  4. php+mysqli实现批量执行插入、更新及删除数据的方法

    本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...

  5. JDBC实现往MySQL插入百万级数据

    想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData; ...

  6. 使用JDBC向数据库中插入一条数据

    原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...

  7. 使用JDBC向Kudu表插入中文数据乱码(转载)

    参考:https://cloud.tencent.com/developer/article/1077763 问题描述 使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文 ...

  8. MySQL_(Java)使用JDBC向数据库中插入(insert)数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  9. JDBC中的批量插入和乱码解决

    字符集-乱码问题 用JDBC访问MySql数据库的时候,如果JDBC使用的字符集和MySql使用的字符集不一致,那么会导致乱码发生.解决办法当时是在使用JDBC的时候指定和数据库一样的字符集.我们可以 ...

随机推荐

  1. C#应用Newtonsoft.Json操作json

    Newtonsoft.Json是一个开源的C#操作json的项目,应用起来非常简单.其github地址; 下面的代码演示了如何应用Newtonsoft.Json序列号和反序列化. using Newt ...

  2. uc/os学习入门:在32位pc机上搭建编译环境

    由于学习ucos的入门资料中所使用的编译器大多都是Borland c ++ 3.1或者Borland c++4.5,为了降低学习的难度最好所用的编译器与书本上的一致.由于4.5版本稍高,所以最终决定用 ...

  3. viPlugin安装破解

    viPlugin是一个eclipse 针对vi的插件,使用此插件可以让你在使用eclipse进行编码时使用几乎所有vi命令,可以极大的提高开发编码效率.  安装  点击你的eclipse中的 help ...

  4. java选项及系统属性

    java选项 -d32 使用 32 位数据模型 (如果可用) -d64 使用 64 位数据模型 (如果可用) -server 选择 "server" VM 默认 VM 是 serv ...

  5. MongoDB 快速入门--初级

    数据库的操作一般来说都是CRUD,这其中最难的就是查询,所有所我们先来了解MongoDB中的 插入(insert) 说到插入,我们就必须得说说如何创建数据库,如何创建集合,然后才是如何创建文档. 在这 ...

  6. 【不积跬步,无以致千里】vim复制

    用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽:上次论坛上有人问到了怎么在vim中使 ...

  7. uva 10152 ShellSort

    //这个算法用到了"相对位置"的思想,并且就本题而言还有一个很重要的结论就是,假设 //移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知, //越先移动 ...

  8. thrift学习笔记

    Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java ...

  9. android service总结

    1.通过startservice方法启动一个服务.service不能自己启动自己.若在一个服务中启动一个activity则,必须是申明一个全新的activity任务TASK.通过startservic ...

  10. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...