JDBC批处理数据

JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。

// 关闭自动执行 
con.setAutoCommit(false); 
Statement stmt = con.createStatement();

  禁用了自动执行模式,从而在调用 Statement.executeBatch() 时可以防止 JDBC 执行事务处理。禁用自动执行使得应用程序能够在发生错误及批处理中的某些命令不能执行时决定是否执行事务处理。因此,当进行批处理更新时,通常应该关闭自动执行。

  在JDBC 2.0 中,Statement 对象能够记住可以一起提交执行的命令列表。创建语句时,与它关联的命令列表为空。Statement.addBatch() 方法为调用语句的命令列表添加一个元素。如果批处理中包含有试图返回结果集的命令,则当调用 Statement. executeBatch() 时,将抛出 SQLException。

  只有 DDL 和 DML 命令(它们只返回简单的更新计数)才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句构
造的命令批处理,则可以调用方法 Statement.clearBatch()(以上没有显示)来重新设置批处理。

 Statement.executeBatch() 方法将把命令批处理提交给基本 DBMS 来执行。命令的执行将依照在批处理中的添加顺序来进行。ExecuteBatch() 为执行的命令返回更新计数数组。数组中对应于批处理中的每个命令都包含了一项,而数组中各元素依据命令的执行顺序(这还是和命令的最初添加顺序相同)来排序。调用executeBatch() 将关闭发出调用的 Statement 对象的当前结果集(如果有一个结果集是打开的)。executeBatch() 返回后,将重新将语句的内部批处理命令列表设置为空。

如果批处理中的某个命令无法正确执行,则 ExecuteBatch() 将抛出BatchUpdateException。可以调用BatchUpdateException.getUpdateCounts() 方法来为批处理中成功执行的命令返回更新计数的整型数组。因为当有第一个命令返回错误时,Statement.executeBatch() 就中止,而且这些命令是依据它们在批处理中的添加顺序而执行的。所以如果 BatchUpdateException.getUpdateCounts() 所返回的数组包含 N 个元素,这就意味着在调用 executeBatch() 时批处理中的前 N 个命令被成功执行。

 1 try {
 2             int row;
 3             Connection connection = null;
 4             // 关闭自动提交
 5             connection.setAutoCommit(false);
 6             String sql = "insert into tb_student(id,name,sex,age) values(?,?,?,?)";
 7             PreparedStatement preparedStatement = (PreparedStatement) connection.prepareStatement(sql);
 8             Random random = new Random();
 9             for (int i = 0; i < 10; i++) {
10                 preparedStatement.setInt(1, i + 1);
11                 preparedStatement.setString(2, "学生" + i);
12                 preparedStatement.setBoolean(3, i % 2 == 0 ? true : false);
13                 preparedStatement.setInt(4, random.nextInt(5) + 10);
14                 preparedStatement.addBatch();  //将for循环的一组参数添加到添加PreparedStatement对象的批处理命令中
15             }
16             int[] rows = preparedStatement.executeBatch();  //PreparedStatement对象的批处理SQL提交给数据库,返回跟新计数的数组
17             row = rows.length;
18         } catch (Exception e) {
19             e.printStackTrace();
20         }

返回:  10

也可以采用下面方式添加:

stmt.addBatch("insert into employee(id,name,sex,phone) values(1,"qg",1,"**********")");
时间: 2024-10-19 06:30:46

JDBC批处理数据的相关文章

Java JDBC批处理插入数据操作

在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作. 首先,使用Java JDBC基本的API批量插入数据到数据库中. Simple Batch - 简单批处理    我把它叫做简单批处理.要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能. 想想一下下面的代码: Bad

day15 分页及 JDBC 大数据的处理

day15 分页及 JDBC 大数据的处理 1. 分页实现(重点) 1.1 自建 EL 表达式去处理简介过长问题 2. 完成客户关系管理案例 3. jdbc 大数据的处理 4. jdbc 实现数据库批处理 5. jdbc 获取数据库自动生成的主键和调用存储过程 5.1 数据库自动生成的主键 5.2 jdbc 调用存储过程(procedure) - 金融证券领域用的特多 6. ResultSet 对结果集进行滚动 Author:相忠良 Email: [email protected] 起始于:Ju

mysql存取大文本text和批处理数据

public class ReadWriteBigData { /* create database bigdata; use bigdata; create table bigdata //创建表 ( id varchar(20)primary key, pinglun text,(大数据) image blob(二进制) );*/ public void insert() { try{ Connection con=DBHelper.getConnection(); String sql="

在Spring中基于JDBC进行数据访问时如何控制超时

超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Transaction Timeout指一组SQL操作执行时应在设定的时间内完成(提交或回滚),否则将引发超时.它的值应大于 N(语句数) * Statement Timeout Statement Timeout指完成单条SQL语句执行的最大允许时间.它的值应小于JDBC Driver Socket Timeou

mysql 存储过程在批处理数据中的应用

最近批处理数据的时候,突然想到:为什么不使用存储过程进行数据批处理? 为什么要进行批处理? 自答:减少数据库连接次数,提高效率. 存储过程批处理数据的优点:一次编译,永久执行. 这次的批处理逻辑较简单,所以使用了存储过程,但是想到当逻辑复杂时,我宁愿不适用存储过程.····

jdbc获取数据具体过程

下面是个最简单的使用jdbc取得数据的应用.在例子之后我将分成4步,分别是①取得连接,②创建PreparedStatement,③设置参数,④执行查询,来分步分析这个过程.除了设置参数那一步之外,其他的我都画了时序图,如果不想看文字的话,可以对着时序图 .文中的第4步是组装MySQL协议并发送数据包的关键,而且在这部分的(b)环节,我对于PreparedStatement的应用有详细的代码注释分析,建议大家关注一下. Java代码 public class DBHelper { public s

9.1(JDBC概述)、(JDBC连接数据库),(JDBC查询数据)

2:JDBC的配置 下载地址:https://dev.mysql.com/downloads/file/?id=470333 这里下载到了C:\Users\王家丰\AppData\Local\Microsoft\Windows\INetCache\IE\Z2F72PPH\mysql-connector-java-5.1.42 3:JDBC连接数据库的步骤 一:注册mysql驱动:两种方式 项目中用的方式:Class.forName("com.masql.jdbc.Driver"); 二

spring jdbc 批处理插入主健重复的数据

1.有事务:当调用spring jdbc 的批处理的时候,在实现层加入事物,只要有插入异常的数据,整个批处理操作都会回滚.事务保证操作的原子性. 2.无事务:当没有事务的时候,批处理插入数据的时候,若主健重复则会直接抛出异常,后面没有主键冲突的依然不会插入,因为当抛出异常的时候,下一次插入操作就不会执行. 3.当想要插入的数据是增量的 有两种方法:第一种删除原来的数据,插入新的数据.第二种:插入数据主健重复的时候做更新操作 insert into   on dupulicate key upda

JDBC批处理Select语句

注:为了更好理解本文,请结合原文阅读 在上一篇文章中提到了PreparedStatement的局限性:PreparedStatement不允许一个占位符(?)设置多个值,本文试图从其它角度来解决该问题. 在网络上开销最昂贵的资源就是客户端与服务器往返的请求与响应,JDBC中类似的一种情况就是对数据库的调用,如果你在做数据插入.更新.删除操作,可以使用executeBatch()方法减少数据库调用次数,如: 1 2 3 4 5 Statement pstmt = conn.createStatem