# 批處理 - **基本介紹:** 1. 當需要成批插入或者更新記錄時。可以採用Java的批量更新機制,這一機制允許多條語句一次性提交給資料庫批量處理。通常情況下比單獨提交處理更有效率。 2. JDBC的批量處理語句包括下麵方法: - addBatch():添加需要批量處理的SQL語句或參數; - ...
批處理
-
基本介紹:
- 當需要成批插入或者更新記錄時。可以採用Java的批量更新機制,這一機制允許多條語句一次性提交給資料庫批量處理。通常情況下比單獨提交處理更有效率。
- JDBC的批量處理語句包括下麵方法:
- addBatch():添加需要批量處理的SQL語句或參數;
- executeBatch():執行批量處理語句;
- clearBatch():清空批處理包的語句;
- JDBC連接MySQL時,如果要使用批處理功能,請在url中加入參數:rewriteBatchedStatements=true。
- 批處理往往和PreparedStatement一起搭配使用,可以即減少編譯次數,又減少運行次數,效率大大提高。
- 批處理是將我們的SQL語句先存放在ArrayList中,當添加到指定的值後就executeBatch,批量處理。批處理會減少我們發送sql語句的網路開銷,而且減少編譯次數,因此效率提高。
案例:
package com.hspedu.jdbc.batch_; import com.hspedu.jdbc.utils.JDBCUtils; import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; /** * @author: 86199 * @date: 2023/7/20 15:34 * Description: 演示Java 的 批處理 */ public class Batch_ { //傳統方法添加數據到admin2表 @Test public void noBatch(){ //得到連接 Connection connection; PreparedStatement preparedStatement; try { connection = JDBCUtils.getConnection(); String sql = "insert into admin2 values (NULL, ?, ?)"; preparedStatement = connection.prepareStatement(sql); System.out.println("開始執行"); long start = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) { preparedStatement.setString(1, "jack" + i); preparedStatement.setString(2, "666"); //執行 preparedStatement.executeUpdate(); } long end = System.currentTimeMillis(); System.out.println("傳統方式 耗時 = " + (end - start));//傳統方式 耗時 = 4825 } catch (SQLException e) { throw new RuntimeException(e); } //關閉資源 JDBCUtils.close(null, preparedStatement, connection); } //使用批量方式添加數據 @Test public void batch(){ //得到連接 Connection connection; PreparedStatement preparedStatement; try { connection = JDBCUtils.getConnection(); String sql = "insert into admin2 values (NULL, ?, ?)"; preparedStatement = connection.prepareStatement(sql); System.out.println("開始執行"); long start = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) { preparedStatement.setString(1, "jack" + i); preparedStatement.setString(2, "666"); //將 sql語句加入批處理包 //執行 preparedStatement.addBatch(); //當有5000條時,再批量執行 if((i + 1) % 1000 == 0){ preparedStatement.executeBatch(); //清空 preparedStatement.clearBatch(); } } long end = System.currentTimeMillis(); System.out.println("批量包方式 耗時 = " + (end - start));//批處理方式 耗時 = 87 } catch (SQLException e) { throw new RuntimeException(e); } //關閉資源 JDBCUtils.close(null, preparedStatement, connection); } }