为了提高对 SQL Server 数据库进行多项更新时的性能,Microsoft SQL Server 2005 JDBC Driver 提供了将多项更新作为一个工作单元提交的功能,也称作“批处理”。

SQLServerStatementSQLServerPreparedStatementSQLServerCallableStatement 类都可用于提交批处理更新。addBatch 方法可用于添加命令。clearBatch 方法可用于清除命令列表。executeBatch 方法可用于提交要处理的所有命令。只有返回简单更新计数的数据定义语言 (Data Definition Language, DDL) 和数据操作语言 (Data Manipulation Language, DML) 语句可作为批处理的一部分运行。

executeBatch 方法返回一个由 int 值组成的数组,这些值对应于每个命令的更新计数。如果其中一条命令失败,则引发 BatchUpdateException,此时应使用 BatchUpdateException 类的 getUpdateCounts 方法检索更新计数数组。如果一条命令失败,则驱动程序会继续处理剩余的命令。但是,如果一条命令有语法错误,批处理中的语句就会失败。

Note注意:

如果不是必须使用更新计数,则可以先向 SQL Server 发送一条 SET NOCOUNT ON 语句。这将减少网络流量并同时提高应用程序的性能。

作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建下表:

CREATE TABLE TestTable 
   (Col1 
int IDENTITY
    Col2 
varchar(50), 
    Col3 
int);

在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,并使用 addBatch 方法创建要执行的语句,然后调用 executeBatch 方法向数据库提交批处理。

public static void executeBatchUpdate(Connection con) {
   
try {
      Statement stmt 
= con.createStatement();
      stmt.addBatch(
"INSERT INTO TestTable (Col2, Col3) VALUES ('X', 100)");
      stmt.addBatch(
"INSERT INTO TestTable (Col2, Col3) VALUES ('Y', 200)");
      stmt.addBatch(
"INSERT INTO TestTable (Col2, Col3) VALUES ('Z', 300)");
      
int[] updateCounts = stmt.executeBatch();
      stmt.close();
   }
   
catch (Exception e) {
      e.printStackTrace();
   }
}