JDBC的批量批量插入
本文部分转载于: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的批量批量插入的更多相关文章
- JMeter 利用Jmeter批量数据库插入数据
利用Jmeter批量数据库插入数据 by:授客 QQ:1033553122 1. 启动Jmeter 2. 添加 DBC Connection Configuration 右键线程组-> ...
- JDBC 复习4 批量执行SQL
1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbe ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
- php+mysqli实现批量执行插入、更新及删除数据的方法
本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...
- JDBC实现往MySQL插入百万级数据
想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData; ...
- 使用JDBC向数据库中插入一条数据
原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...
- 使用JDBC向Kudu表插入中文数据乱码(转载)
参考:https://cloud.tencent.com/developer/article/1077763 问题描述 使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文 ...
- MySQL_(Java)使用JDBC向数据库中插入(insert)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
- JDBC中的批量插入和乱码解决
字符集-乱码问题 用JDBC访问MySql数据库的时候,如果JDBC使用的字符集和MySql使用的字符集不一致,那么会导致乱码发生.解决办法当时是在使用JDBC的时候指定和数据库一样的字符集.我们可以 ...
随机推荐
- 注意 sizeof 中不要有复杂运算操作
http://github.tiankonguse.com/blog/2014/12/05/c-base/ 一个比较有意思的问题 #include<stdio.h> ; int f() { ...
- Java设计模式系列之单例模式
单例模式的定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供.比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象.会方便操作其中的数据,又要保证多个程序读到的是同一个配置文 ...
- PC问题-(仅供备用)取消磁盘的自动扫描
问题现象:有一次整个单位停电了,之后再开机,每次电脑都自检.现在不想让电脑自检了. 问题原因:可能是因为停电,造成了系统文件的破坏. 问题处理:禁用电脑自检功能(注册表方法). Windows Reg ...
- WinAPI: FindWindow、FindWindowEx - 查找窗口
FindWindow( lpClassName, {窗口的类名} lpWindowName: PChar {窗口的标题} ): HWND; {返回窗口的 ...
- [每日一题] 11gOCP 1z0-053 :2013-10-11 Flashback Data Archive属性.........................43
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12656897 正确答案:BD 闪回数据归档请参考:http://blog.csdn.net ...
- VMware搭建12.0搭建Mac OS10.11详细过程
1.软件准备 1.1VMware12.0 1.2VMware增强包 1.3Mac OS10.11 cdr(相当于dmg) 1.4securable.exe 2.软件破解 2.1VMware输入序列号破 ...
- SQLServer2008设置开启INTERNET远程连接
SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 使用sa账户登录SQL Se ...
- flex 简单跑马灯效果(竖着显示)
<mx:Move id="move_area" target="{VBox_AreaWarning}"/> //move效果,模拟跑马灯 <s ...
- JQuery UI Widget Factory官方Demo
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Codeforces Beta Round #51 D. Beautiful numbers 数位dp
D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...