JDBC批量處理
批量處理允許將相關的SQL語句分組到批處理中,並通過對數據庫的一次調用來提交它們,一次執行完成與數據庫之間的交互。
一次向數據庫發送多個SQL語句時,可以減少通信開銷,從而提高性能。
- 不需要JDBC驅動程序來支持此功能。應該使用
DatabaseMetaData.supportsBatchUpdates()
方法來確定目標數據庫是否支持批量更新處理。如果JDBC驅動程序支持此功能,該方法將返回true
。 -
Statement
,PreparedStatement
和CallableStatement
的addBatch()
方法用於將單個語句添加到批處理。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批處理示例代碼」