JDBC - 批处理



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

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

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

  • Statement、PreparedStatementCallableStatementaddBatch() 方法用于将单个语句添加到批处理中。executeBatch() 用于启动所有分组语句的执行。

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

  • 就像您可以将语句添加到批处理以进行处理一样,您也可以使用 clearBatch() 方法将其删除。此方法删除您使用 addBatch() 方法添加的所有语句。但是,您不能选择性地选择要删除哪个语句。

使用 Statement 对象进行批处理

以下是使用 Statement 对象进行批处理的典型步骤序列:

  • 使用 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();

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

使用 PrepareStatement 对象进行批处理

以下是使用 PrepareStatement 对象进行批处理的典型步骤序列:

  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
PreparedStatement 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();

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

广告