在對 SQL Server 資料庫進行多重更新時,為了改進效能,Microsoft SQL Server 2005 JDBC Driver 提供以單一工作單元提交多重更新的功能,這也稱為批次。
SQLServerStatement、SQLServerPreparedStatement 和 SQLServerCallableStatement 類別都可以用來提交批次更新。addBatch 方法是用來加入命令。clearBatch 方法是用來清除命令清單。executeBatch 方法是用來提交所有命令以供處理。只有傳回簡單更新計數的資料定義語言 (DDL) 和資料操作語言 (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();
}
}