Executando operações em lote
Para melhorar o desempenho quando várias atualizações de um banco de dados do SQL Server estiverem ocorrendo, o Microsoft JDBC Driver para SQL Server tem a capacidade de enviar várias atualizações como apenas uma unidade de trabalho, também chamada de lote.
As classes SQLServerStatement, SQLServerPreparedStatement e SQLServerCallableStatement podem ser usadas para enviar atualizações em lote. O método addBatch é usado para adicionar um comando. O método clearBatch é usado para limpar a lista de comandos. O método executeBatch é usado para enviar todos os comandos para processamento. Apenas as instruções DDL (linguagem de definição de dados) e DML (linguagem de manipulação de dados) que retornam uma contagem de atualização simples podem ser executadas como parte de um lote.
O método executeBatch retorna uma matriz de valores int que correspondem à contagem de atualizações de cada comando. Se um dos comandos falhar, um BatchUpdateException será gerado e você deverá usar o método getUpdateCounts da classe BatchUpdateException para recuperar a matriz de contagem de atualização. Se um comando falhar, o driver continuará processando os comandos restantes. No entanto, se um comando tiver um erro de sintaxe, as instruções do lote falharão.
Observação
Caso não precise usar contagens de atualizações, emita primeiro uma instrução SET NOCOUNT ON para o SQL Server. Isso reduzirá o tráfego de rede, além de melhorar o desempenho do aplicativo.
Como exemplo, crie a seguinte tabela no banco de dados de exemplo AdventureWorks2022:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
No exemplo a seguir, uma conexão aberta com o banco de dados de exemplo AdventureWorks2022 é passada para a função, o método addBatch é usado para criar as instruções a serem executadas e o método executeBatch é chamado para enviar o lote ao banco de dados.
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();
}
}