JDBC批次處理


批次處理允許將相關的SQL語句分組到批次處理中,並通過對資料庫的一次呼叫來提交它們,一次執行完成與資料庫之間的互動。

一次向資料庫傳送多個SQL語句時,可以減少通訊開銷,從而提高效能。

  • 不需要JDBC驅動程式來支援此功能。應該使用DatabaseMetaData.supportsBatchUpdates()方法來確定目標資料庫是否支援批次更新處理。如果JDBC驅動程式支援此功能,該方法將返回true
  • StatementPreparedStatementCallableStatementaddBatch()方法用於將單個語句新增到批次處理。 executeBatch()用於執行組成批次的所有語句。
  • executeBatch()返回一個整數陣列,陣列的每個元素表示相應更新語句的更新計數。
  • 就像將批次處理語句新增到處理中一樣,可以使用clearBatch()方法刪除它們。此方法將刪除所有使用addBatch()方法新增的語句。 但是,無法指定選擇某個要刪除的語句。

使用Statement物件進行批次處理

以下是使用Statement物件的批次處理的典型步驟序列 -

  • 使用createStatement()方法建立Statement物件。
  • 使用setAutoCommit()將自動提交設定為false
  • 使用addBatch()方法在建立的Statement物件上新增SQL語句到批次處理中。
  • 在建立的Statement物件上使用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,'Ruby', 'Yang', 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,'Java', 'Lee', 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();

為了更好的理解,建議學習和研究「JDBC批次處理範例程式碼」。

使用PrepareStatement物件進行批次處理

以下是使用PrepareStatement物件進行批次處理的典型步驟順序 -

  • 使用預留位置建立SQL語句。
  • 使用prepareStatement()方法建立PrepareStatement物件。
  • 使用setAutoCommit()將自動提交設定為false
  • 使用addBatch()方法在建立的Statement物件上新增SQL語句到批次處理中。
  • 在建立的Statement物件上使用executeBatch()方法執行所有SQL語句。
  • 最後,使用commit()方法提交所有更改。

以下程式碼段提供了使用PreparedStatement物件進行批次更新的範例 -

// 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, "JDBC" );
pstmt.setString( 3, "Li" );
pstmt.setInt( 4, 33 );
// Add it to the batch
pstmt.addBatch();

// Set the variables
pstmt.setInt( 1, 401 );
pstmt.setString( 2, "CSharp" );
pstmt.setString( 3, "Liang" );
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();

為了更好的理解,建議學習和研究「JDBC批次處理範例程式碼