执行批量操作
为了提高对 SQL Server 数据库进行多项更新时的性能,Microsoft JDBC Driver for SQL Server 提供了将多项更新作为一个工作单元提交的功能,也称作“批处理”。
SQLServerStatement、SQLServerPreparedStatement 和 SQLServerCallableStatement 类都可用于提交批量更新。 addBatch 方法可用于添加命令。 clearBatch 方法可用于清除命令列表。 executeBatch 方法可用于提交要处理的所有命令。 只有返回简单更新计数的数据定义语言 (Data Definition Language, DDL) 和数据操作语言 (Data Manipulation Language, DML) 语句可作为批处理的一部分运行。
executeBatch 方法返回一个由 int 值组成的数组,这些值对应于每个命令的更新计数。 如果其中一条命令失败,则会引发 BatchUpdateException,应使用 BatchUpdateException 类的 getUpdateCounts 方法检索更新计数数组。 如果一条命令失败,则驱动程序会继续处理剩余的命令。 但是,如果一条命令有语法错误,批处理中的语句就会失败。
注意
如果不是必须使用更新计数,可以先向 SQL Server 发送一条 SET NOCOUNT ON 语句。 这将减少网络流量并同时提高应用程序的性能。
作为示例,在 AdventureWorks2022 示例数据库中创建下表:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
在下面的示例中,将向此函数传递 AdventureWorks2022 示例数据库的开放式连接,并使用 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();
}
}