Выполнение пакетных операций
Чтобы повысить производительность при выполнении нескольких обновлений баз данных SQL Server, Microsoft JDBC Driver для SQL Server предоставляет возможность передавать несколько обновлений в единой рабочей единице, которая называется пакетом.
Для передачи пакетных обновлений можно использовать следующие классы: SQLServerStatement, SQLServerPreparedStatement и SQLServerCallableStatement. Метод addBatch используется для добавления команды. Метод clearBatch используется для очистки списка команд. Метод executeBatch используется для передачи всех команд для обработки. В качестве части пакета могут выполняться только инструкции языка описания данных DDL и языка обработки данных DML, возвращающие простой счетчик обновлений.
Метод executeBatch возвращает массив значений int, соответствующих счетчику обновлений каждой команды. При ошибке выполнения одной из команд создается исключение BatchUpdateException, и пользователю следует использовать метод getUpdateCounts класса BatchUpdateException для извлечения массива счетчиков обновления. При возникновении ошибки выполнения команды драйвер продолжает обработку остальных команд. Однако при наличии ошибки синтаксиса в команде происходит ошибка инструкций в пакете.
Примечание.
Если отсутствуют счетчики обновлений, можно сначала отправить инструкцию SET NOCOUNT ON в SQL Server. Это позволит уменьшить объем сетевого трафика и увеличить производительность приложений.
Например, создайте следующую таблицу в примере базы данных 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();
}
}