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批處理示例代碼」