为了提高对 SQL Server 数据库进行多项更新时的性能,Microsoft SQL Server 2005 JDBC Driver 提供了将多项更新作为一个工作单元提交的功能,也称作“批处理”。
SQLServerStatement、SQLServerPreparedStatement 和 SQLServerCallableStatement 类都可用于提交批处理更新。addBatch 方法可用于添加命令。clearBatch 方法可用于清除命令列表。executeBatch 方法可用于提交要处理的所有命令。只有返回简单更新计数的数据定义语言 (Data Definition Language, DDL) 和数据操作语言 (Data Manipulation Language, DML) 语句可作为批处理的一部分运行。
executeBatch 方法返回一个由 int 值组成的数组,这些值对应于每个命令的更新计数。如果其中一条命令失败,则引发 BatchUpdateException,此时应使用 BatchUpdateException 类的 getUpdateCounts 方法检索更新计数数组。如果一条命令失败,则驱动程序会继续处理剩余的命令。但是,如果一条命令有语法错误,批处理中的语句就会失败。
注意: |
如果不是必须使用更新计数,则可以先向 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();
}
}