JDBC 批量高效插入數據


1.批量執行SQL語句

當需要成批插入或者更新記錄時,可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率

JDBC的批量處理語句包括下面三個方法:

  • addBatch(String):添加需要批量處理的SQL語句或是參數;
  • executeBatch():執行批量處理語句;
  • clearBatch():清空緩存的數據

通常我們會遇到兩種批量執行SQL語句的情況:

  • 多條SQL語句的批量處理;
  • 一個SQL語句的批量傳參;

2 .高效的批量插入

舉例:向數據表中插入20000條數據

  • 數據庫中提供一個goods表。創建如下:
    在這里插入圖片描述

3.代碼實現

package com.atguigu5.blob;

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

import com.atguigu3.util.JDBCUtils;

/* * 使用PreparesStatement實現批量數據操作 * upadte delete本身就具有批量操作的效果 * 此時的批量操作主要指的是批量插入,使用PreparedStatement如何實現更高效的批量插入 * * 題目:向goods中插入20000條數據 * CREATE TABLE goods( id INT PRIMARY KEY auto_increment, NAME VARCHAR(25) ); * 方式一:使用Statement * Connection conn=JDBCUtils.getConnection; * Statement st= conn.createStatement(); * for(int i=1;i<=20000;i++){ * String sql="insert into goods(name)values('name_"+i+"')"; * st.execute(sql); * } * * * * */
public class InsertTest {
	//批量插入的方式二:使用PreparesStatement
	@Test
	public void testInsert1()  {
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			long start = System.currentTimeMillis();
			conn = JDBCUtils.getConnection();
			
			String sql="insert into goods(name)values(?)";
			ps = conn.prepareStatement(sql);
			
			for (int i = 0; i < 20000; i++) {
				ps.setObject(1,"name_"+i);
				ps.execute();
			}
			long end = System.currentTimeMillis();

			System.out.println("花費的時間為:"+(end-start));
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(conn, ps);

		}
	}
	
	/* *批量插入的方式三: *addBatch(String):添加需要批量處理的SQL語句或是參數; *executeBatch():執行批量處理語句; *clearBatch():清空緩存的數據 *2、mysql服務器默認是關閉批處理的,我們需要通過一個參數,讓mysql開啟批處理的支持。 * ?rewriteBatchedStatements=true 寫在配置文件的url后面 * */
	@Test
	public void testInsert2() {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			
			long start = System.currentTimeMillis();
			
			conn = JDBCUtils.getConnection();
			String sql = "insert into goods(name)values(?)";
			ps = conn.prepareStatement(sql);
			for(int i = 1;i <= 1000000;i++){
				ps.setObject(1, "name_" + i);
				
				//1."攢"sql
				ps.addBatch();
				
				if(i % 500 == 0){
					//2.執行batch
					ps.executeBatch();
					
					//3.清空batch
					ps.clearBatch();
				}
				
			}
			
			long end = System.currentTimeMillis();
			
			System.out.println("花費的時間為:" + (end - start));//20000:83065 -- 565
		} catch (Exception e) {								//1000000:16086
			e.printStackTrace();
		}finally{
			JDBCUtils.closeResource(conn, ps);
			
		}
		
	}
	//批量插入的方式四:設置連接不允許自動提交數據
	@Test
	public void testInsert3() {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			
			long start = System.currentTimeMillis();
			
			conn = JDBCUtils.getConnection();
			//設置不允許自動提交
			conn.setAutoCommit(false);
			String sql = "insert into goods(name)values(?)";
			ps = conn.prepareStatement(sql);
			for(int i = 1;i <= 1000000;i++){
				ps.setObject(1, "name_" + i);
				
				//1."攢"sql
				ps.addBatch();
				
				if(i % 500 == 0){
					//2.執行batch
					ps.executeBatch();
					
					//3.清空batch
					ps.clearBatch();
				}
				
			}
			//提交數據
			conn.commit();
			
			long end = System.currentTimeMillis();
			
			System.out.println("花費的時間為:" + (end - start));//20000:83065 -- 565
		} catch (Exception e) {								//1000000:16086
			e.printStackTrace();
		}finally{
			JDBCUtils.closeResource(conn, ps);
			
		}
		
	}
	
}

4.方法三種批處理的配置文件:

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM