一、批处理介绍

     当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
JDBC的批量处理语句包括下面两个方法:
     addBatch(String): 添加需要批量处理的SQL语句或是参数。
        executeBatct(): 执行批量处理语句。

二、批处理的使用

1.使用事务没有批处理

	@Test
public void testBatch(){ Connection con = null;
PreparedStatement ps = null; try{
// 保证连接是唯一的,传入相同的Connnection
con = JdbcTools.getConnection();
//开启事务
JdbcTools.beginTx(con);
String sql = "insert into person(name,city) values(?,?)";
ps = con.prepareStatement(sql); long begin = System.currentTimeMillis(); // 插入10000条数据
for(int i = 0;i < 100000;i++){
ps.setString(1,"A"+ i);
ps.setString(2,"BJ");
ps.executeUpdate();
}
//提交事务
JdbcTools.commitTx(con); long end = System.currentTimeMillis();
System.out.println("Time: " + (end - begin)); //14684
}catch(Exception e){
e.printStackTrace();
// 回滚事务
JdbcTools.rollBackTx(con);
}finally{
JdbcTools.releaseResource(con,null,null);
}
}

结果: Time: 15127

 

2.使用事务+批处理

	@Test
public void testBatch2(){ Connection con = null;
PreparedStatement ps = null; try{
// 保证连接是唯一的,传入相同的Connnection
con = JdbcTools.getConnection();
//开启事务
JdbcTools.beginTx(con);
String sql = "insert into person(name,city) values(?,?)";
ps = con.prepareStatement(sql); long begin = System.currentTimeMillis(); // 插入10000条数据
for(int i = 0;i < 100000;i++){
ps.setString(1,"A"+ i);
ps.setString(2,"BJ"); //"积攒"SQL
ps.addBatch(); if((i + 1) % 300 == 0){
ps.executeBatch();
ps.clearBatch();
} }
if(100000 % 300 != 0){
ps.executeBatch();
ps.clearBatch();
} //提交事务
JdbcTools.commitTx(con); long end = System.currentTimeMillis();
System.out.println("Time: " + (end - begin)); //17010
}catch(Exception e){
e.printStackTrace();
// 回滚事务
JdbcTools.rollBackTx(con);
}finally{
JdbcTools.releaseResource(con,null,null);
}
}

结果: Time: 17201

     看到这个结果,哎呦卧槽,你泥马不是坑爹么,这批处理逗我玩呢。经过百度、Google才得知如下的内容。

     在MySQL JDBC连接字符串中还可以加入参数。

     rewriteBatchedStatements=true。

     mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的SQL语句。    

     useServerPrepStmts=false。

     如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL。在此稍加改进,连接字符串中加入下面语句。

connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";

再次运行结果: Time: 1933

JDBC基础学习(五)—批处理插入数据的更多相关文章

  1. Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  2. Java JDBC批处理插入数据操作(转)

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  3. FreeSql (五)插入数据

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  4. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  5. JDBC基础学习(三)—处理BLOB类型数据

    一.BLOB类型介绍      在MySQL中,BLOB是一个二进制的大型对象,可以存储大量数据的容器,它能容纳不同大小的数据.      在MySQL中有四种BLOB类型.          实际使 ...

  6. JDBC基础学习(一)—JDBC的增删改查

    一.数据的持久化     持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各 ...

  7. JDBC基础学习(二)—PreparedStatement

    一.PreparedStatement介绍     在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用P ...

  8. JDBC连接数据库:单线程、多线程、批处理插入数据的对比

    一.单线程(单条循环)插入50000条记录: 每执行一次就要访问一次数据库 import java.sql.Connection; import java.sql.DriverManager; imp ...

  9. 【JDBC】学习路径6-SQL插入、修改、删除数据

    第一章:插入使用.executeUpdate(); 返回的是受到影响的数据条数. public static boolean insert(String username,String passwor ...

随机推荐

  1. Windows内存管理简介:

    1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空   (2):固定空间分配:固定分 ...

  2. ETL kettle 数据调取防止意外停止处理

    pentaho kettle是目前使用比较广泛的一种etl工具 但是在使用的时候如做定时任务 会存在如果任务异常停止会发生数据不准或者丢失数据的情况 这种情况在<Pentho Kettle So ...

  3. 关于synchronized、wait、notify已经notifyAll的使用

    前言:关于synchronized.wait.notify已经notifyAll大家应该不陌生,现在我大致说一下我的理解. 一:synchronized synchronized中文解释是同步,那么什 ...

  4. java Log日志规范

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...

  5. dns服务搭建

    DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的. 域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器 ...

  6. Omi教程-插件体系

    插件体系 Omi是Web组件化框架,怎么又来了个插件的概念? 可以这么理解: Omi插件体系可以赋予dom元素一些能力,并且可以和组件的实例产生关联. omi-drag 且看这个例子: 点击这里→在线 ...

  7. 每天一个linux命令(25)--Linux文件属性详解

    Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令: ls  -lih 2098120 lrwxr ...

  8. windows container (docker) 容器资料笔记

    背景 业务需求:简化公司私有云,公有云的部署,尝试寻找更好的,更优化的技术方案替换现有的虚拟机部署方案. 技术背景: .net Docker 学习资料 Docker中文社区: http://www.d ...

  9. Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面

    上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友可以点击链接回去 ...

  10. MySQL调优三步曲(慢查询、explain profile)

    在做性能测试中经常会遇到一些sql的问题,其实做性能测试这几年遇到问题最多还是数据库这块,要么就是IO高要么就是cpu高,所以对数据的优化在性能测试过程中占据着很重要的地方,下面我就介绍一些msyql ...