executeBatch()是什么 如何大幅度提升系统的性能
来源:互联网 发布时间:2021-05-11 16:46:33

executeBatch()详解

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

// 关闭自动执行

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 命令(它们只返回简单的更新计数)才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句构

1

2

3

造的命令批处理,则可以调用方法 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 int 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 executeBatch

* may be one of the following:

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

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

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

A value of SUCCESS_NO_INFO – 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来说明命令执行情况。

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

* this method throws aBatchUpdateException, 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

*BatchUpdateException.getUpdateCounts

* 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()方法返回

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

A value ofEXECUTE_FAILED-- 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,并且只有在命令出错后驱动继续执行的情况下才会出现,

如果出错后不再执行,则返回的结果中没有错误信息只有那些被成功执行后的结果。

* 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 aBatchUpdateExceptionobejct 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 ofSQLException) 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的子类。

关键词: executeBatch() 系统 性能 大幅度提升

猜你喜欢

圣基茨和尼维斯公布2022年国家预算:“恢复”和“发展”成为重点

圣基茨和尼维斯公布2022年国家预算:“恢复”和“

圣基茨和尼维斯总理蒂莫西·哈里斯(Timothy Harris)于12月14日公布了2022年的政府预算。哈里斯总...更多

2022-01-15 20:59:51
泛亚铁路中线老泰段提速,磨丁融入东南亚协同开放,畅通国际大动脉

泛亚铁路中线老泰段提速,磨丁融入东南亚协同开放

近期,中泰两国会面讨论MR Map和南部大陆桥项目,期间,泰国交通部长萨沙扬与中国驻泰国大使韩志强...更多

2022-01-15 14:44:40
锚定全零售 国美推进高质量发展

锚定全零售 国美推进高质量发展

近期,星展银行发表了对国美零售的更新研报,认为进入全零售战略周期的国美零售股价具有约14%的溢价...更多

2022-01-14 17:24:53
打破市场垄断 统一润滑油加速替代进口进程

打破市场垄断 统一润滑油加速替代进口进程

润滑油是石油和化工行业的重要组成部分,具有应用范围广、技术含量高、产品附加值高的特点,是工业...更多

2022-01-14 15:55:31
统一石化发布首款减碳润滑油 誓将低碳战略进行到底

统一石化发布首款减碳润滑油 誓将低碳战略进行到

43 12%!这是统一高压液压油的有效减碳率。去年底,统一石化正式对外发布了碳索者系列减碳产品,其...更多

2022-01-14 15:54:18
统一石化软实力解读之:1+N数字化联盟

统一石化软实力解读之:1+N数字化联盟

12月18日,统一润滑者粘会上,统一石化宣布正式启动1+N数字化联盟项目,进而从根本上解决各类用户的...更多

2022-01-14 15:42:47
国美全零售取得阶段性成绩:线上月活突破6500万 线下销售额提升超40%

国美全零售取得阶段性成绩:线上月活突破6500万

如果说2021年是国美全零售由概念到雏形的一年,那么2022年就是国美全零售从雏形到生态的一年。所谓...更多

2022-01-14 13:48:49

中国网游帮战第一人 纳兰西狂带队进驻《剑侠世界

由西山居剑侠金牌班底打造的新一代剑侠情缘手游《剑侠世界3》已全平台上线!江湖中刀光剑影,热血战...更多

2022-01-14 11:36:40
把握下沉市场消费力 国美如何做到的?

把握下沉市场消费力 国美如何做到的?

在2021中国新消费发展论坛上,中国(海南)改革发展研究院院长迟福林开讲《中国消费大趋势》时提到...更多

2022-01-13 18:44:47

腾讯微保携手长城人寿共推“互联网专属两全产品新

1月12日,由腾讯微保、长城人寿共同举办的稳住我们能赢,裕见确定人生新品线上发布会圆满落幕。发布...更多

2022-01-13 17:51:01


© 2012-2020 财经快报网 版权所有

网站联系邮箱:98 28 36 7@qq.com