1. 程式人生 > >使用JDBC進行批處理

使用JDBC進行批處理

在實際的專案開發中,有時候需要向資料庫傳送一批SQL語句執行,這時應避免向資料庫一條條的傳送執行,而應採用JDBC的批處理機制,以提升執行效率。
JDBC實現批處理有兩種方式:

  • 第一種方式:Statement.addBatch(sql)
  • 第二種方式:PreparedStatement.addBatch()

使用Statement完成批處理

  1. 使用Statement物件新增要批量執行的SQL語句,如下:

    Statement.addBatch(sql1);
    Statement.addBatch(sql2);
    Statement.addBatch(sql3);
  2. 執行批處理SQL語句

    Statement.executeBatch();
  3. 清除批處理命令

    Statement.clearBatch();

使用Statement完成批處理範例

  1. 編寫測試的SQL指令碼建立表。

    create table testbatch
    (
        id varchar(40) primary key,
        name varchar(40)
    );
  2. 編寫測試程式碼,如下所示:

    public class Demo3 {
    
        /*
        create table testbatch
        (
            id varchar(40) primary key,
            name varchar(40)
        );
    
        */
    // 實現批處理的第一種方式 @Test public void test1() throws SQLException { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); String sql1 = "insert into testbatch(id,name) values('1','李阿雲')"
    ; // 1.可以傳送不同的sql語句 2.傳送的sql語句沒有預編譯 String sql2 = "update testbatch set name='李阿昀' where id='1'"; st = conn.createStatement(); // Statement內部維護了一個List集合,addBatch()方法加入的sql語句都加入到該List集合內了。 st.addBatch(sql1); st.addBatch(sql2); st.executeBatch(); // 返回int[] [3,4]——即第一條sql語句執行影響資料庫表幾行,第二條sql語句執行影響資料庫表幾行,... st.clearBatch(); // 清除清除批處理命令 } finally { JdbcUtils.release(conn, st, rs); } } }

採用Statement.addBatch(sql)方式實現批處理的優缺點

採用Statement.addBatch(sql)方式實現批處理:

  • 優點:可以向資料庫傳送多條不同的SQL語句。
  • 缺點:

    • SQL語句沒有預編譯。
    • 當向資料庫傳送多條語句相同,但僅引數不同的SQL語句時,需重複寫上很多條SQL語句。例如:

      Insert into user(name,password) values(‘aa’,’111’);
      Insert into user(name,password) values(‘bb’,’222’);
      Insert into user(name,password) values(‘cc’,’333’);
      Insert into user(name,password) values(‘dd’,’444’);

使用PreparedStatement完成批處理

使用PreparedStatement完成批處理範例

public class Demo3 {

    /*
    create table testbatch
    (
        id varchar(40) primary key,
        name varchar(40)
    );

    */
    // 實現批處理的第二種方式
    @Test
    public void test2() throws SQLException {

        long starttime = System.currentTimeMillis();
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql1 = "insert into testbatch(id,name) values(?,?)"; // 1.適合做批量插入和批量更新   2.傳送的sql語句都預編譯過,效能會好一點。實際開發裡,此種方式用到的多一點。
            st = conn.prepareStatement(sql1);

            /*
            st.setString(1, "1");
            st.setString(2, "李阿雲");
            st.addBatch(); // 把PreparedStatement物件內部封裝的sql語句加入到PreparedStatement物件內部的List集合中

            st.setString(1, "2");
            st.setString(2, "葉一");
            st.addBatch();  // 此時PreparedStatement物件內部的List集合中有兩條sql語句
            */

            // 批處理一千萬條sql語句,會出現OutOfMemoryError:Java heap space——記憶體溢位
            /*
            for (int i = 1; i <= 10000000; i++) {
                st.setString(1, i+"");
                st.setString(2, "葉一"+i);
                st.addBatch();
            }
            st.executeBatch();
            */
            for (int i = 1; i <= 10000006; i++) {
                st.setString(1, i+"");
                st.setString(2, "葉一"+i);
                st.addBatch();

                if (i%1000==0) {
                    st.executeBatch();
                    st.clearBatch();
                }
                st.executeBatch(); // 剩下不到1000條sql語句也需要執行
            }
        } finally {
            JdbcUtils.release(conn, st, rs);
        }

        long endtime = System.currentTimeMillis();
        System.out.println("共花了:"+(endtime-starttime)/1000+"秒"); // 向MySQL資料庫批插入1000萬條記錄,大概需要3個多小時。而Oracle資料庫測試大概需要380秒
    }
}

採用PreparedStatement.addBatch()方式實現批處理的優缺點

採用PreparedStatement.addBatch()實現批處理

  • 優點:傳送的是預編譯後的SQL語句,執行效率高。
  • 缺點:只能應用在SQL語句相同,但引數不同的批處理中。因此此種形式的批處理經常用於在同一個表中批量插入資料,或批量更新表的資料。

關於JDBC批處理的內容就總結這麼多。

相關推薦

使用JDBC進行處理

在實際的專案開發中,有時候需要向資料庫傳送一批SQL語句執行,這時應避免向資料庫一條條的傳送執行,而應採用JDBC的批處理機制,以提升執行效率。 JDBC實現批處理有兩種方式: 第一種方式:Statement.addBatch(sql) 第二種方式:Pre

JDBC進行處理的四種方式

這裡以MySQL資料庫為例來展示四種通過jdbc實現批處理的四種方法,這裡只舉例了插入100條資料的寫法,其他大致相同。 第一種:最簡單,最好理解的(不要這樣寫) (沒工作經驗可能會這樣寫,執行效率

比較JDBC和Mybatis進行處理時的效能比較

執行批量操作時,做了個比較Mybatis和JDBC執行時間的記錄,JDBC還是強大太多了! jdbc.properties檔案 jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterE

Java的jdbc使用addBatch進行處理操作的幾種方式

方式一、批量執行預定義模式的SQL public static void exeBatch(Connection conn) { try { String sql = "insert into t_example (code, name) values (?,?)";

處理(一):使用WorkspaceRunner進行處理

原文連結: https://knowledge.safe.com/articles/1469/batch-processing-using-the-workspacerunner-1.html?smartspace=chaining-workspaces 一、介紹 WorkspaceRu

玩轉MySQL -----JDBC處理

自動增長(只有int型可以自動增長) 除了在資料庫圖形介面設定外: 還可以在java中用這句程式碼:st.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); statement //獲取insert時生成的自動增

JDBC從入門到放棄-06:JDBC處理

JDBC從入門到放棄 06-JDBC的批處理 當有成批插入或者更新記錄的需求時,可以採用JDBC的批量更新機制,這一機制允許多條語句一次性的提交給資料庫批量處理。通常情況下比單獨處理要更有效率。 批量處理一般流程。 假設我們有100000條資料要插入的資料庫,採用批處

對圖片命名進行處理修改

最近在研究深度學習,需要對圖片進行TFrecord格式的轉換,可是收集到的訓練圖片命名格式千變萬化,沒有一個統一格式,看起來很不舒服。於是希望通過一個指令碼函式對其進行批處理重新命名。 # -*- coding: utf-8 -*- """ Created on Mon Nov 5 23:41

【python】pytorch中如何使用DataLoader對資料集進行處理

第一步: 我們要建立torch能夠識別的資料集型別(pytorch中也有很多現成的資料集型別,以後再說)。 首先我們建立兩個向量X和Y,一個作為輸入的資料,一個作為正確的結果:      隨後我們需要把X和Y組成一個完整的資料集,並轉化為pytorch能

cmd和python兩種進行處理操作

1.cmd命令列進行批處理,實現對某一檔案下所有檔案進行相同的處理 a.獲取資料夾下的檔案目錄,存入a.txt中 b.由於我是要對檔案進行SectionSing.exe(C++程式產生的exe操作),要進行滿足其格式要求的操作, 可以將所有檔案複製放到excel表格

用PS對多張照片進行處理的步驟

1.準備錄制動作 開啟一張示例照片,在動作面板中(若無按Alt + F9 出現)新建一個動作,根據要做的操作合理命名,然後點“錄製”; 2.開始錄制動作 經過一系列操作達到效果後,點“儲存為”,

JDBC batch處理Statement executeBatch 詳解

JDBC提供了資料庫batch處理的能力,在資料大批量操作(新增、刪除等)的情況下可以大幅度提升系統的效能。我以前接觸的一個專案,在沒有采用batch處理時,刪除5萬條資料大概要半個小時左右,後來對系統進行改造,採用了batch處理的方式,刪除5萬條資料基本上不會超過1分鐘。看一段JDBC程式碼: // 關

JDBC操作數據庫之處理

解決方案 print 數據庫服務器 密碼 red rep 參數 connect jdb JDBC開發中,操作數據庫需要和數據庫建立連接,然後將要執行的SQL語句發送到數據庫服務器,最後關閉數據庫連接,都是按照這樣的操做的,如果按照此流程要執行多條SQL語句,那麽就要建立多個

JDBC入門(4)--- 處理

集合 for mysql connect 通過 入門 code 這一 匹配 1、Statement批處理   當你有10條SQL語句要執行時,一次向服務器發送一條SQL語句,這樣做的效率上極差,處理的方案是使用批處理,即一次向服務發送多條SQL語句,然後由服務器一次性處理。

JDBC【PreparedStatment、處理處理二進制、自動主鍵、調用存儲過程、函數】

參數 高效 gpo 批量處理 資源 key limit 場景 註入 1.PreparedStatement對象 PreparedStatement對象繼承Statement對象,它比Statement對象更強大,使用起來更簡單 Statement對象編譯SQL語句時,如果

通過處理進行Windows服務的安裝/卸載&啟動/停止

spa windows服務 lse nbsp off checked ram service window 安裝服務 1 @echo off 2 3 set checked=2 4 set PATHS=%~sdp0 5 6 echo 按任意鍵執行安裝……?

JDBC處理

utils 服務 red min 利用 eat 判斷 防止 實現 批處理:   當我們需要向數據庫中插入大量數據時,批處理會將這些數據打成多個批次addBatch(),統一發送給數據庫服務器執行executeBatch(),減少與數據庫的交互次數提高程序的執行效率。 實現批

JDBC 處理

!= count test .exe false upd code exceptio nal 主要是是 addBatch ,executeBatch ,clearBatch 三個方法. 官方示例代碼: public void batchUpdate() throw

關於jdbc處理的一些小問題

一個專案實現過程中難免遇到一些批量執行sql語句的情況,例如執行1萬條插入語句,如果使用傳統的插入方式則需要建立1萬次連線,一次傳送一條sql語句,這樣是及其浪費效能的,接下來通過三種不同的方式模擬批量的插入語句,程式碼如下: package com.lsm1998.shop.test; im

JDBC事務、處理、大物件的基本使用

一、測試事務的概念和用法  package com.chenfu.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import