DRP——JDBC中的Batch
在jdbc2.0里添加了批量处理的功能(batch),其同意将多个sql语句作为一个单元送至数据库去运行,这样做能够提高操作效率。在操作大量的数据时,
ORM框架实现批量是非常慢的。我们能够使用jdbc提供的Batch来提高效率。
演示样例:
首先是使用for循环,一句一句的运行:
public class TestCommon {
static long startTime;
public static void main(String[] args) throws Exception { Connection conn = getConnection();
PreparedStatement ps = null;
try {
startTime=System.nanoTime(); //获取開始时间
ps = conn
.prepareStatement("INSERT INTO batchtab values (?, ? )");
conn.setAutoCommit(false);
for (int n = 0; n < 10000; n++) {
Integer i = new Integer(n);
ps.setString(1, i.toString());
ps.setString(2, "value" + i.toString());
ps.executeUpdate();
}
conn.commit();
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序执行时间: "+(endTime-startTime)+"ns");
}catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("Message: " + ex.getMessage());
System.out.println("Vendor error code: " + ex.getErrorCode());
} catch (Exception e) {
e.printStackTrace();
System.err.println("Exception: " + e.getMessage());
} finally {
if (conn != null)
conn.close();
if (ps != null)
ps.close();
}
} public static Connection getConnection() {
Connection con = null; //创建用于连接数据库的Connection对象
try {
Class.forName("com.mysql.jdbc.Driver");// 载入Mysql数据驱动 con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/TestBatch", "root", "123456");// 创建数据连接 } catch (Exception e) {
System.out.println("数据库连接失败" + e.getMessage());
}
return con; //返回所建立的数据库连接
}
}
使用Batch,批量操作:
public class TestPreStatementBatch {
static long startTime;
public static void main(String[] args) throws Exception { Connection conn = getConnection();
ResultSet rs = null;
PreparedStatement ps=null;
try { startTime=System.nanoTime(); //获取開始时间 ps = conn.prepareStatement("INSERT INTO batchtab values (? , ? )");
conn.setAutoCommit(false);
ps.clearBatch(); for (int n=0; n<10000; n++) {
Integer i = new Integer(n);
ps.setString(1, i.toString());
ps.setString(2, "value" + i.toString());
ps.addBatch();
}
ps.executeBatch();
conn.commit();
long endTime=System.nanoTime(); //获取结束时间
//打印消耗时间
System.out.println("程序执行时间: "+(endTime-startTime)+"ns");
} catch (BatchUpdateException b) {
System.out.println("SQLException: " + b.getMessage());
System.out.println("SQLState: " + b.getSQLState());
System.out.println("Message: " + b.getMessage());
System.out.println("Vendor error code: " + b.getErrorCode());
System.out.print("Update counts: "); } catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("Message: " + ex.getMessage());
System.out.println("Vendor error code: " + ex.getErrorCode());
} catch (Exception e) {
e.printStackTrace();
System.err.println("Exception: " + e.getMessage());
} finally {
if( conn != null )
conn.close();
if(ps !=null)
ps.close();
if(rs !=null)
rs.close(); }
} public static Connection getConnection() {
Connection con = null; //创建用于连接数据库的Connection对象
try {
Class.forName("com.mysql.jdbc.Driver");// 载入Mysql数据驱动 con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/TestBatch", "root", "123456");// 创建数据连接 } catch (Exception e) {
System.out.println("数据库连接失败" + e.getMessage());
}
return con; //返回所建立的数据库连接
}
}
不同点:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2xpeDFhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
一条条的循环插入是每插入一条数据都会调用一次运行;而Batch是把全部的数据全都存起来。之后调用一次运行。数据量非常大的话,效率就会差非常多。
数据说话——执行结果:
总结:
通过插入一万条一样的数据消耗的时间,我们能够看到相差的时间。我们能够通过降低语句的多次运行来提高性能。事实上,同.NET中的SqlBulkCopy思想一样。一次运行WriteToServer。就如同生活中我们做事情一样。不能仅仅想做了即可,还要多多思考有没有什么方法能够做到更好。
DRP——JDBC中的Batch的更多相关文章
- JDBC 中的事务和批处理 batch
JDBC事务处理: 事务处理一般在事务开始前把事务提交设置为false 所有DML语句执行完成后提交事务 demo: package com.xzlf.jdbc; import java.sql.Co ...
- JDBC中的Statement和PreparedStatement的区别
JDBC中的Statement和PreparedStatement的区别
- [转]JDBC中日期时间的处理技巧
Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...
- JDBC中的事务-Transaction
事务-Transaction 某些情况下我们希望对数据库的某一操作要么整体成功,要么整体失败,经典的例子就是支付宝提现.例如我们发起了支付宝到银行卡的100元提现申请,我们希望的结果是支付宝余额减少1 ...
- Oracle数据库编程:在JDBC中应用Oracle
9.在JDBC中应用Oracle: JDBC访问数据库基本步骤: 1.加载驱动 2.获取链接对象 3.创建SQL语句 4.提交S ...
- JDBC中的ResultSet无法多次循环的问题。
前几天碰见了一个很奇葩的问题,使我百思不得其解,今天就写一下我遇见的问题吧,也供大家参考,别和我犯同样的毛病. 首先说下jdbc,jdbc是java是一种用于执行SQL语句的Java API,从jdb ...
- 在JDBC中使用Java8的日期LocalDate、LocalDateTime
在实体Entity里面,可以使用java.sql.Date.java.sql.Timestamp.java.util.Date来映射到数据库的date.timestamp.datetime等字段 但是 ...
- 使用JDBC中的出现的乱码和查询无结果问题
使用JDBC中的问题 连接的后出现查询结果是乱码. 1.可能是代码的编码与数据库的编码不同 有可以将二者都设置为UTF-8 2.如果比较懒得话可以只设代码为UTF-8 mysql 连接url中us ...
- 转:JDBC中关于PreparedStatement.setObject的一些细节说明
原文地址:https://blog.csdn.net/zhiyangxuzs/article/details/78657235 JDBC中PreparedStatement.setObject(ind ...
随机推荐
- golang中接口interface和struct结构类的分析
再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...
- java学习助手
感谢大家使用Java学习助手! 打一开始,这应用就是全开源,希望大家自觉遵循开源协议,还Android开发一片净土(国内的情况你懂的) 接下来都不会更频繁更新文章,大家更应该把注意力放在基础的模块那里 ...
- XAML实时显示更新插件LiveXAML
XAML实时显示更新插件LiveXAML LiveXAML是Visual Studio的第三方扩展插件.该插件可以从Visual Studio Marketplace下载,也可以从官网下载http: ...
- zTree通过指定ID找到节点并选中
zTree = $.fn.zTree.getZTreeObj("treeDemo");//treeDemo界面中加载ztree的div var node = zTree.getNo ...
- [NOIP2017]列队(线段树/裂点splay)
考虑n=1的做法,就是支持: 1.在线删一个数 2.在结尾加一个数 3.查询序列的第y个数 用线段树记录区间内被删元素的个数,可以通过线段树上二分快速得解,对于新增的数,用vector记录即可. 对于 ...
- Android之Fragment优点
什么是Fragment 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片.片段.其目的是为了解决不同屏幕分辩率的动态和灵活UI设计.大屏幕如平板小屏幕如手机,平 ...
- django基础入门
1. http协议 1.1 请求协议 请求协议格式: 请求首行: // 请求方式 请求路径 协议和版本,例如:GET /index.html HTTP/1.1 请求头信息: // 请求头名称:请求头内 ...
- 第2篇--JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...
- bzoj 2154
收获: 1.当一个东西的取值范围很小时,或者感觉它很麻烦时,就枚举它 2.熟悉mobius函数.euler函数的和函数,以及euler函数用mobius函数的表示. 3.下取整分块理解更深了. /** ...
- bzoj 1468
大概思路:树点分治,重心树中每个重心维护一个总的平衡树,树中保存属于该重心的点到该重心的距离,然后对于去掉该重心后形成的子树分别再保存一份. 用这种方式实现的话,还可以支持修改与多次查询,每次操作都是 ...