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 ...
随机推荐
- pandas - 案例(股票分析)
需求: 使用tushare包获取某股票的历史行情数据. 输出该股票所有收盘比开盘上涨3%以上的日期. 输出该股票所有开盘比前日收盘跌幅超过2%的日期. 假如我从2010年1月1日开始,每月第一个交易日 ...
- fastclick:处理移动端click事件300毫秒延迟
fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...
- 06007_redis数据存储类型——hash
1.概述 (1)Redis中的Hash类型可以看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息,如Username.Password和Age等: ...
- selenium动作链
简介 一般来说我们与页面的交互可以使用Webelement的方法来进行点击等操作. 但是,有时候我们需要一些更复杂的动作,类似于拖动,双击,长按等等. 这时候就需要用到我们的Action Chains ...
- 详解Cookie、LocalStorage、SessionStorage
不管是笔试还是面试相信大家都会经常遇到问Cookie.LocalStorage.SessionStorage 这三个不同的,什么不说先上一波图先: 针对他们大小之分应用场景也有不同: 因为考虑到每个 ...
- Servlet3.0中使用getPart进行文件上传
这个先进些,简单些,但书上提供的例子不能使用,到处弄了弄才行. servlet代码: package cc.openhome; import java.io.InputStream; import j ...
- N天学习一个linux命令之xz
前言 最近使用gitbook写接口文档,gitbook需要nodejs执行环境.安装nodejs时,发现安装包使用的是xz后缀,它是使用LZMA无损数据压缩算法生成的文件,压缩率很高.GNU已经内置了 ...
- QPS计算
案例:公司xiaoyb性能测试评估 我们预估支持500家学校,每所学校300人,每天有10%的活跃率,每天有500*300*10%=15000人,每人每天平均请求20次,每天大概请求时间共8小时,80 ...
- Android之使用MediaMetadataRetriever类获取视频第一帧
一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类.大家能够 ...
- jQuery总结04
1 JavaScript 中的 AJAX 的四个实现步骤分别是? 2 如何处理 XMLHttpRequest 对象的兼容问题? 3 jQuery 中的 AJAX 4 jQuery 选择器包括哪些? 5 ...