目录 | 上一页 | 下一页 JDBCTM 指南:入门


6 批处理更新

批处理更新功能可以一次向数据库提交多个更新操作,要求数据库进行处理。一起提交多个更新(而非一个一个单独地提交更新)在某些情况下将大大提高性能。可以利用 StatementPreparedStatementCallableStatement 对象来提交批处理更新。

6.1 批处理更新的使用

6.1.1 语句

批处理更新功能允许 Statement 对象将一组相异的更新命令作为一个单位或批处理提交给基本 DBMS。下例中,在假想的公司数据库中插入新雇员所需的所有更新操作是作为单个批处理提交的。

// 关闭自动执行
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 个命令被成功执行。

6.1.2 预先准备好的语句

批处理更新功能与预先准备好的语句一起配合使用时可将多个输入参数值集合与一个 PreparedStatement 对象相关联。随后,就能将参数值和关联的参数化更新命令作为单一单元送交给基本 DBMS 引擎来执行。

下例将两条新增雇员记录作为一次批处理插入到数据库中。本例使用 PreparedStatement.setXXX() 方法来创建每个参数集合(每个雇员对应一个),而使用 PreparedStatement.addBatch() 方法将一组参数添加到当前批处理中。

// 关闭自动执行
con.setAutoCommit(false);

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

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();

// 提交要执行的批处理
int[] updateCounts = stmt.executeBatch();


最后,它将调用 PreparedStatement.executeBatch() 来将更新传给 DBMS。对于 PreparedStatement 对象,其错误处理类似于对 Statement 对象的错误处理。

6.1.3 可调用语句

批处理更新功能使用 CallableStatement 对象进行工作的方式与使用 PreparedStatement 对象进行工作的方式相同。多个输入参数值的集合可以与可调用语句相关联,然后一起送交给 DBMS。批处理更新功能与可调用语句一起使用所调用的存储过程必须返回更新计数,而且可以不必有输出或输入输出参数。如果违反这个限制条件,则 CallableStatement.executeB atch() 方法会抛出异常。



目录 | 上一页 | 下一页


jdbc@eng.sun.comjdbc-business@eng.sun.com

版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利