JDBC基础学习(五)—批处理插入数据
一、批处理介绍
当需要成批插入或者更新记录时。可以采用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基础学习(五)—批处理插入数据的更多相关文章
- Java JDBC批处理插入数据操作
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- Java JDBC批处理插入数据操作(转)
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- FreeSql (五)插入数据
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- JDBC基础学习(三)—处理BLOB类型数据
一.BLOB类型介绍 在MySQL中,BLOB是一个二进制的大型对象,可以存储大量数据的容器,它能容纳不同大小的数据. 在MySQL中有四种BLOB类型. 实际使 ...
- JDBC基础学习(一)—JDBC的增删改查
一.数据的持久化 持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各 ...
- JDBC基础学习(二)—PreparedStatement
一.PreparedStatement介绍 在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用P ...
- JDBC连接数据库:单线程、多线程、批处理插入数据的对比
一.单线程(单条循环)插入50000条记录: 每执行一次就要访问一次数据库 import java.sql.Connection; import java.sql.DriverManager; imp ...
- 【JDBC】学习路径6-SQL插入、修改、删除数据
第一章:插入使用.executeUpdate(); 返回的是受到影响的数据条数. public static boolean insert(String username,String passwor ...
随机推荐
- 2017-2-19 C#基础 数据类型
数据类型分为基本数据类型和引用类型.基本数据类型分为两大类,值类型,字符型(char)和布尔型(bool).其中值类型分为整型和浮点型.整型分为byte,short,int,long.常用的是int( ...
- EFcore与动态模型(二)
上篇文章中介绍了如何使用ef进行动态类型的管理,比如我们定义了ShopDbContext并且注册了动态模型信息,下面的代码实现了动态信息的增加: Type modelType = IRuntimeMo ...
- DP 动态规划
p1269 马棚 题目: 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他 ...
- WebSocket浅析(一):实现群聊功能
首先WebSocket打破了传统的web请求响应模式,实现管道式的实时通信,并且可以持续连接. 相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 So ...
- 【转】44款Java 网络爬虫开源软件
原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...
- 3月题外:关于JS实现图片缩略图效果的一些小问题
由于3月可能要结束实习,所以应该不会有特别固定的主题,另外我会在月初陆续补上上个月的番外篇Projection和TMS,作为介绍性的内容对矢量切片部分进行补充,剩下时间不定期写一些杂烩. 最近两天在做 ...
- Android -- RecyclerView实现顶部吸附效果
1,先来看一下今天实现的效果: 2,这次的效果是使用ItemDecoration来实践的,来看一看我们的实现吧 第一步:首先添加依赖,由于我们这些数据是请求网络的,所以一下我们添加网络框架依赖.Rec ...
- Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 2
接上一篇文章的内容. 看了前面需求提到的复杂的命令行解析功能,很多人立马开始发怵,其实大可不必. 我们都知道,Linux下的程序往往都提供了复杂的命令行参数处理机制,因为这是与 其他程序或用户进行交互 ...
- redux-form的学习笔记二--实现表单的同步验证
(注:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/ 在这篇博客里,我将用redux-f ...
- ubuntu Error mounting /dev/sda6 at /media/xxx...
问题原因:可能是windows没有完全关机,详细请看我的另一博文: http://www.cnblogs.com/ediszhao/p/3794459.html 为了学习linux我装了双系统,因为我 ...