Realización de operaciones por lotes
Con el fin de mejorar el rendimiento al realizar varias actualizaciones en una base de datos de SQL Server, el controlador JDBC de Microsoft para SQL Server ofrece la posibilidad de enviar varias actualizaciones como una sola unidad de trabajo, denominada también lote.
Las clases SQLServerStatement, SQLServerPreparedStatement y SQLServerCallableStatement se pueden usar para enviar actualizaciones por lotes. El método addBatch se usa para agregar un comando. El método clearBatch se usa para borrar la lista de comandos. El método executeBatch se usa para enviar todos los comandos para su procesamiento. Tan solo las instrucciones de lenguaje de definición de datos (DDL) y lenguaje de manipulación de datos (DML) que devuelven un recuento de actualizaciones sencillo se pueden ejecutar como parte de un lote.
El método executeBatch devuelve una matriz de valores int que se corresponde con el recuento de actualizaciones de cada comando. Si se produce un error en uno de los comandos, se inicia una excepción BatchUpdateException y debe usar el método getUpdateCounts de la clase BatchUpdateException para recuperar la matriz de recuento de actualización. Si un comando produce un error, el controlador sigue procesando los comandos restantes. No obstante, si un comando contiene un error de sintaxis, las instrucciones del lote generan un error.
Nota:
Si no necesita usar recuentos de actualizaciones, puede ejecutar primero la instrucción SET NOCOUNT ON para SQL Server. De este modo, se reduce el tráfico de red y, además, se aumenta el rendimiento de la aplicación.
Cree, a modo de ejemplo, el siguiente tabla en la base de datos de ejemplo AdventureWorks2022:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
En el siguiente ejemplo, se pasa una conexión abierta a la base de datos de ejemplo AdventureWorks2022 a la función, se usa el método addBatch para crear las instrucciones que se van a ejecutar y se llama al método executeBatch para enviar el lote a la base de datos.
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();
}
}