JDBC - 批处理

批处理允许您将相关的 SQL 语句分组到一个批处理中,并通过一次调用数据库来提交它们。

一次向数据库发送多个 SQL 语句时,可以减少通信开销,从而提高性能。

  • 不需要 JDBC 驱动程序来支持此功能。 您应该使用 DatabaseMetaData.supportsBatchUpdates() 方法来确定目标数据库是否支持批量更新处理。 如果您的 JDBC 驱动程序支持此功能,则该方法返回 true。

  • Statement、PreparedStatementCallableStatementaddBatch() 方法用于将单个语句添加到批处理中。 executeBatch() 用于开始执行所有组合在一起的语句。

  • executeBatch() 返回一个整数数组,数组的每个元素代表相应更新语句的更新计数。

  • 正如您可以将语句添加到批处理以进行处理一样,您可以使用 clearBatch() 方法删除它们。 此方法删除您使用 addBatch() 方法添加的所有语句。 但是,您不能有选择地选择要删除的语句。


使用语句对象进行批处理

以下是对语句对象使用批处理的典型步骤序列 −

  • 使用 createStatement() 方法创建一个 Statement 对象。

  • 使用 setAutoCommit() 将自动提交设置为 false。

  • 使用创建的语句对象上的 addBatch() 方法将任意数量的 SQL 语句添加到批处理中。

  • 在创建的语句对象上使用 executeBatch() 方法执行所有 SQL 语句。

  • 最后,使用 commit() 方法提交所有更改。

示例

以下代码片段提供了使用 Statement 对象进行批量更新的示例 −

// Create statement object
Statement stmt = conn.createStatement();

// Set auto-commit to false
conn.setAutoCommit(false);

// Create SQL statement
String SQL = "INSERT INTO Employees (id, first, last, age) " +
             "VALUES(200,'Zia', 'Ali', 30)";
// Add above SQL statement in the batch.
stmt.addBatch(SQL);

// Create one more SQL statement
String SQL = "INSERT INTO Employees (id, first, last, age) " +
             "VALUES(201,'Raj', 'Kumar', 35)";
// Add above SQL statement in the batch.
stmt.addBatch(SQL);

// Create one more SQL statement
String SQL = "UPDATE Employees SET age = 35 " +
             "WHERE id = 100";
// Add above SQL statement in the batch.
stmt.addBatch(SQL);

// Create an int[] to hold returned values
int[] count = stmt.executeBatch();

//Explicitly commit statements to apply changes
conn.commit();

For a better understanding, let us study the Batching - Example Code.


使用 PreparedStatement 对象进行批处理

以下是使用带有 PreparedStatement 对象的批处理的典型步骤序列 −

  1. 创建带有占位符的 SQL 语句。

  2. 使用 prepareStatement() 方法创建 PrepareStatement 对象。

  3. 使用 setAutoCommit() 将自动提交设置为 false。

  4. 使用创建的语句对象上的 addBatch() 方法将任意数量的 SQL 语句添加到批处理中。

  5. 在创建的语句对象上使用 executeBatch() 方法执行所有 SQL 语句。

  6. 最后,使用 commit() 方法提交所有更改。

以下代码片段提供了使用 PrepareStatement 对象进行批量更新的示例 −

// Create SQL statement
String SQL = "INSERT INTO Employees (id, first, last, age) " +
             "VALUES(?, ?, ?, ?)";

// Create PrepareStatement object
PreparedStatemen pstmt = conn.prepareStatement(SQL);

//Set auto-commit to false
conn.setAutoCommit(false);

// Set the variables
pstmt.setInt( 1, 400 );
pstmt.setString( 2, "Pappu" );
pstmt.setString( 3, "Singh" );
pstmt.setInt( 4, 33 );
// Add it to the batch
pstmt.addBatch();

// Set the variables
pstmt.setInt( 1, 401 );
pstmt.setString( 2, "Pawan" );
pstmt.setString( 3, "Singh" );
pstmt.setInt( 4, 31 );
// Add it to the batch
pstmt.addBatch();

//add more batches
.
.
.
.
//Create an int[] to hold returned values
int[] count = stmt.executeBatch();

//Explicitly commit statements to apply changes
conn.commit();

为了更好地理解,让我们研究一下批处理 - 示例代码