JDBC: 批量处理提高SQL处理速度
引用:忘了
当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理;
一个SQL语句的批量传参;
测试代码:
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.Statement; import org.junit.Test; import xuezaipiao1.JDBC_Tools;
/**
* 向Oracle 的 temp 数据表中添加 10万 条记录
* 测试如何插入,用时最短
*/ public class JDBCTest { /**
*
* 1.使用 Statement .
* 测试用时:35535
*/
@Test
public void testBbatchStatement() {
Connection conn = null;
Statement statement = null;
String sql = null;
try {
conn = JDBC_Tools.getConnection();
JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis();
statement = conn.createStatement();
for(int i = 0;i<100000;i++){
sql = "INSERT INTO temp values("+(i+1)
+",'name_"+(i+1)+"','13-6月 -15')";
statement.executeUpdate(sql);
}
long endTime = System.currentTimeMillis();
System.out.println("Time : "+(endTime - beginTime));
JDBC_Tools.commit(conn);
} catch (Exception e) {
e.printStackTrace();
JDBC_Tools.rollback(conn);
}finally{
JDBC_Tools.relaseSource(conn, statement);
}
} /**
* 使用PreparedStatement
* 测试用时:9717
*/
@Test
public void testBbatchPreparedStatement() {
Connection conn = null;
PreparedStatement ps = null;
String sql = null;
try {
conn = JDBC_Tools.getConnection();
JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis();
sql = "INSERT INTO temp values(?,?,?)";
ps = conn.prepareStatement(sql);
Date date = new Date(new java.util.Date().getTime());
for(int i = 0;i<100000;i++){
ps.setInt(1, i+1);
ps.setString(2, "name_"+i);
ps.setDate(3, date);
ps.executeUpdate();//
}
long endTime = System.currentTimeMillis();
System.out.println("Time : "+(endTime - beginTime));
JDBC_Tools.commit(conn);
} catch (Exception e) { e.printStackTrace();
JDBC_Tools.rollback(conn);
}finally{
JDBC_Tools.relaseSource(conn, ps);
}
} /**
* 测试用时 : 658
*/
@Test
public void testBbatch() {
Connection conn = null;
PreparedStatement ps = null;
String sql = null;
try {
conn = JDBC_Tools.getConnection();
JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis();
sql = "INSERT INTO temp values(?,?,?)";
ps = conn.prepareStatement(sql);
Date date = new Date(new java.util.Date().getTime());
for(int i = 0;i<100000;i++){
ps.setInt(1, i+1);
ps.setString(2, "name_"+i);
ps.setDate(3, date); //积攒SQL
ps.addBatch(); //当积攒到一定程度,就执行一次,并且清空记录
if((i+1) % 300==0){
ps.executeBatch();
ps.clearBatch();
}
}
//总条数不是批量值整数倍,则还需要在执行一次
if(100000 % 300 != 0){
ps.executeBatch();
ps.clearBatch();
}
long endTime = System.currentTimeMillis();
System.out.println("Time : "+(endTime - beginTime));
JDBC_Tools.commit(conn);
} catch (Exception e) { e.printStackTrace();
JDBC_Tools.rollback(conn);
}finally{
JDBC_Tools.relaseSource(conn, ps);
}
}
}
JDBC: 批量处理提高SQL处理速度的更多相关文章
- JDBC批量Insert深度优化(有事务)
环境: MySQL 5.1 RedHat Linux AS 5 JavaSE 1.5 DbConnectionBroker 微型数据库连接池 测试的方案: 执行10万次Insert语句,使用不同方 ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- JDBC批量处理
转载自http://www.cnblogs.com/xdp-gacl/p/3983253.html 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而 ...
- 三种JDBC批量插入编程方法的比较
JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStat ...
- jdbc批量插入
分享牛,分享牛原创.有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧. ...
- mybatis 的批量更新操作sql
转: mybatis 的批量更新操作sql 2018年07月23日 10:38:19 海力布 阅读数:1689 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- JDBC批量执行executeBatch
JDBC事务 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态.为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这 ...
- JDBC批量插入数据优化,使用addBatch和executeBatch
JDBC批量插入数据优化,使用addBatch和executeBatch SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? 解决方案:用 preparedSta ...
- JDBC批量操作性能提升
JDBC 当使用INSERT INTO....VALUES()语句批量插入的时候,应该使用JDBC的PreparedStatement的批量操作方法,而不是採用一条一条运行的方法. 比如(来源:htt ...
随机推荐
- Ubuntu网卡设置:配置/etc/netplan
对于Ubuntu1804版本,经过测试如下配置可以设置静态IP地址: Google@ubuntu:~$ cat /etc/netplan/01-netcfg.yaml network: etherne ...
- 小白两篇博客熟练操作MySQL 之 第二篇
小白两篇博客熟练操作MySQL 之 第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...
- Codeforces 912D - Fishes
传送门:http://codeforces.com/contest/912/problem/D 本题是一个概率问题——求数学期望. 在一个n×m的方格中,有k个“*”.每个格子里可能有0~1个“*”. ...
- qwb VS 去污棒
qwb VS 去污棒 Time Limit: 2 Sec Memory Limit: 256 MB Description qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月.在外人看来,他每天自 ...
- hdu 4975 最大流解决行列和求矩阵问题,用到矩阵dp优化
//刚开始乱搞. //网络流求解,如果最大流=所有元素的和则有解:利用残留网络判断是否唯一, //方法有两种,第一种是深搜看看是否存在正边权的环,见上一篇4888 //至少四个点构成的环,第二种是用矩 ...
- hdu_1019_Least Common Multiple_201310290920
Least Common Multiple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu_1018_Big Number_201308191556
Big NumberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Mac OSX:安装zsh
想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...
- AngularJS:日期转换字符
JS有很多类库提供日期转换函数,AngularJS也不例外.可以通过$filter来完成转换,方法如下: $filter('date')(sourceDate, "yyyy/MM/dd&qu ...
- 【转】shell中的内建命令, 函数和外部命令
原文:http://www.cnblogs.com/xkfz007/archive/2011/10/13/2209571.html linux命令有内部命令和外部命令之分.内部命令实际上是shell程 ...