JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下能够大幅度提升系统的性能。我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系统进行改造,採用了batch处理的方式,删除5万条数据基本上不会超过1分钟。看一段JDBC代码:

// 关闭自己主动运行

con.setAutoCommit(false);

Statement stmt = con.createStatement();



stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");

stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");

stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");



// 提交一批要运行的更新命令

int[] updateCounts = stmt.executeBatch();

本例中禁用了自己主动运行模式,从而在调用 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 个命令被成功运行。用PreparedStatement 能够象以下这样写代码:

// 关闭自己主动运行

con.setAutoCommit(false);

PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");




stmt.setInt(1, 2000);

stmt.setString(2, "Kelly Kaufmann");

stmt.addBatch();

// 提交要运行的批处理

int[] updateCounts = stmt.executeBatch();

========================================

PrepareStatement 也是接口

PrepareStatement extends Statement

PrepareStatement 本身没有 int[] executeBatch() throws SQLException 方法

而是继承了Statement的方法,且它们都是接口没有实际实现方法,但Statement

接口对executeBatch()方法做了规范

/**

     * Submits a batch of commands to the database for execution and

     * if all commands execute successfully, returns an array of update counts.

       每次提交一批命令到数据库中运行,假设全部的命令都成功运行了,那么返回一个

       数组,这个数组是说明每条命令所影响的行数

     * The <code>int</code> elements of the array that is returned are ordered

     * to correspond to the commands in the batch, which are ordered

     * according to the order in which they were added to the batch.

       返回的数组中每一个整型值都是排过序的,它们的顺序和批量处理中的命令们是一致的,

       命令的顺序是依照它们被加到批处理中的顺序一致。

     * The elements in the array returned by the method <code>executeBatch</code>

     * may be one of the following:

       executeBatch方法返回的数组中的元素可能是以下几种情形之中的一个:

     * <OL>

     * <LI>A number greater than or equal to zero -- indicates that the

     * command was processed successfully and is an update count giving the

     * number of rows in the database that were affected by the command's

     * execution

       一个大于或等于零的数字,简单说来命令成功运行后就返回它所影响到的行的数目

     * <LI>A value of <code>SUCCESS_NO_INFO</code> -- indicates that the command was

     * processed successfully but that the number of rows affected is

     * unknown

       

      * The constant indicating that a batch statement executed successfully

      * but that no count of the number of rows it affected is available.

      int SUCCESS_NO_INFO = -2;

      常量SUCCESS_NO_INFO代表的值=-2,也就是说命令运行成功了但命令影响到的行数

      无法统计,是未知的,仅仅能返回SUCCESS_NO_INFO来说明命令运行情况。

     * <P> * If one of the commands in a batch update fails to execute properly,

     * this method throws a <code>BatchUpdateException</code>, and a JDBC

     * driver may or may not continue to process the remaining commands in

     * the batch.

       假设批量处理时当中一个命令运行失败,则会抛出一个异常BatchUpdateException

       JDBC驱动可能会停止剩余的命令,也可能继续运行剩余的命令。

     * However, the driver's behavior must be consistent with a

     * particular DBMS, either always continuing to process commands or never

     * continuing to process commands.

       无论如何,驱动要怎么做取决于数据库管理系统的细节,总是运行或总是不运行两者其一。

     * If the driver continues processing

     * after a failure, the array returned by the method

     * <code>BatchUpdateException.getUpdateCounts</code>

     * will contain as many elements as there are commands in the batch, and

     * at least one of the elements will be the following:

       发生失败后假设驱动继续运行,通过BatchUpdateException.getUpdateCounts()方法返回

       的数组应该包含批处理中有的那些命令的结果,而且至少有一个元素的值是以下的情况:

     * <P>

     * <LI>A value of <code>EXECUTE_FAILED</code> -- indicates that the command failed

     * to execute successfully and occurs only if a driver continues to

     * process commands after a command fails

           int EXECUTE_FAILED = -3;

           指示命令没有成功运行的常量值EXECUTE_FAILED,而且仅仅有在命令出错后驱动继续运行的情况下才会出现,

           假设出错后不再运行,则返回的结果中没有错误信息仅仅有那些被成功运行后的结果。

     * </OL>

     * <P> * A driver is not required to implement this method.

     * The possible implementations and return values have been modified in

     * the Java 2 SDK, Standard Edition, version 1.3 to

     * accommodate the option of continuing to proccess commands in a batch

     * update after a <code>BatchUpdateException</code> obejct has been thrown.

       驱动不实现此方法,可能会出现的实现和返回值在Java 2 SDK,Standard Edition,

       version 1.3 ,以适应批处理时抛出BatchUpdateException 异常后是继续运行还是

       终止运行的选项。

      

     * @return an array of update counts containing one element for each

     * command in the batch. The elements of the array are ordered according

     * to the order in which commands were added to the batch.

       返回一个和加入�命令时的顺序一样的数组结果

     * @exception SQLException if a database access error occurs or the

     * driver does not support batch statements. Throws {@link BatchUpdateException}

     * (a subclass of <code>SQLException</code>) if one of the commands sent to the

     * database fails to execute properly or attempts to return a result set.

     * @since 1.3

     */

       假设数据库訪问异常或驱动不支持批处理命令,或者假设一个命令发送到数据库时失败或尝试取得结果集

       时失败,都会抛一个异常BatchUpdateException 它是SQLException的子类。

JDBC batch批处理Statement executeBatch 具体解释的更多相关文章

  1. JDBC batch批量Statement executeBatch 详细解释

    JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...

  2. JDBC进行批处理Batch

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  3. [javaSE] JDBC的批处理

    向数据库发送多条sql语句 create database batch use batch create table batch_table( id int primary key auto_incr ...

  4. JDBC的批处理操作三种方式 pstmt.addBatch()

    package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...

  5. JDBC进行批处理

    转自 http://mousepc.iteye.com/blog/1131462 业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升 ...

  6. 使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  7. JavaWeb学习总结(十一)--JDBC之批处理

    一.批处理的介绍 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.批处理只针对更新(增.删.改)语句,批 ...

  8. javaweb学习总结(三十六)——使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  9. JDBC的批处理操作三种方式

    SQL批处理是JDBC性能优化的重要武器,批处理的用法有三种. package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import ...

随机推荐

  1. Objective-C基础知识点总结

    一.#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别 答: ...

  2. 关于Core Data的一些整理(二)

    关于Core Data的一些整理(二) 创建NSManagedObject的子类时,有一点是在这中间要强调的一点是,要不要勾选 Use scalar properties for primitive ...

  3. idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?

    idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found? 很久没用idea搭新工程,最近自己想做个东西,冲心搭个web工程,jar包都 ...

  4. MySQL 缓存 Query Cache

    QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使 用QC.每个Cache都是以SQL文本作为key来存的.在应 ...

  5. 如何使用LoadRunner监控Windows

    1.监视连接前的准备工作   1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Service (开始—)运行 ...

  6. Configuration ReportNG with TestNG

    下载 Reporter.jar,velocity-dep-1.4.jar 和 Guice.jar: 配置项目属性:Properties ->TestNG ->Disable Default ...

  7. FLEX 网格布局及响应式处理

    上一篇文章用Flex实现BorderLayout,这一章我们来实现常用的网格布局和响应式处理. 首先我们定义HTML结构,主Box为grid,每项为grid-cell,下面就是我们HTML代码结构. ...

  8. 《asp.net mvc3 高级编程》第一章

    以前项目中用过mvc2,虽然mvc4早已出来,但手头只有mvc3的书籍,索性就学学MVC3吧. asp.net mvc 3 概述 (1)友好的试图表达,其中包括新的Razor视图引擎 (2)支持.NE ...

  9. Python按行读取文件

    1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...

  10. JQuery调用iframe父页面元素与方法

    JQuery操作iframe父页面与子页面的元素与方法 下面简单使用Jquery来操作iframe的一些记录,这个使用纯JS也可以实现. 第一.在iframe中查找父页面元素的方法: $('#id', ...