1. 程式人生 > >JDBC batch批處理Statement executeBatch 詳解

JDBC batch批處理Statement executeBatch 詳解

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

// 關閉自動執行
con.setAutoCommit(false);
Statement stmt = con.createStatement();

stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");

// 提交一批要執行的更新命令
int[] updateCounts = stmt.executeBatch();

    本例中禁用了自動執行模式,從而在呼叫 Statement.executeBatch() 時可以防止 JDBC 執行事務處理。禁用自動執行使得應用程式能夠在發生錯誤及批處理中的某些命令不能執行時決定是否執行事務處理。因此,當進行批處理更新時,通常應該關閉自動執行。

    在JDBC 2.0 中,Statement 物件能夠記住可以一起提交執行的命令列表。建立語句時,與它關聯的命令列表為空。Statement.addBatch() 方法為呼叫語句的命令列表新增一個元素。如果批處理中包含有試圖返回結果集的命令,則當呼叫 Statement. executeBatch() 時,將丟擲 SQLException。只有 DDL 和 DML 命令(它們只返回簡單的更新計數)才能作為批處理的一部分來執行。如果應用程式決定不提交已經為某語句構
造的命令批處理,則可以呼叫方法 Statement.clearBatch()(以上沒有顯示)來重新設定批處理。

    Statement.executeBatch() 方法將把命令批處理提交給基本 DBMS 來執行。命令的執行將依照在批處理中的新增順序來進行。ExecuteBatch() 為執行的命令返回更新計數陣列。陣列中對應於批處理中的每個命令都包含了一項,而陣列中各元素依據命令的執行順序(這還是和命令的最初新增順序相同)來排序。呼叫executeBatch() 將關閉發出呼叫的 Statement 物件的當前結果集(如果有一個結果集是開啟的)。executeBatch() 返回後,將重新將語句的內部批處理命令列表設定為空。

    如果批處理中的某個命令無法正確執行,則 ExecuteBatch() 將丟擲BatchUpdateException。可以呼叫BatchUpdateException.getUpdateCounts() 方法來為批處理中成功執行的命令返回更新計數的整型陣列。因為當有第一個命令返回錯誤時,Statement.executeBatch() 就中止,而且這些命令是依據它們在批處理中的新增順序而執行的。所以如果 BatchUpdateException.getUpdateCounts() 所返回的陣列包含 N 個元素,這就意味著在呼叫 executeBatch() 時批處理中的前 N 個命令被成功執行。用PreparedStatement 可以象下面這樣寫程式碼:


// 關閉自動執行
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

// 提交要執行的批處理
int[] updateCounts = stmt.executeBatch();

========================================

PrepareStatement 也是介面
PrepareStatement extends Statement
PrepareStatement 本身沒有 int[] executeBatch() throws SQLException 方法
而是繼承了Statement的方法,且它們都是介面沒有實際實現方法,但Statement
介面對executeBatch()方法做了規範
/**
     * Submits a batch of commands to the database for execution and
     * if all commands execute successfully, returns an array of update counts.
       每次提交一批命令到資料庫中執行,如果所有的命令都成功執行了,那麼返回一個
       陣列,這個陣列是說明每條命令所影響的行數
     * The <code>int</code> elements of the array that is returned are ordered
     * to correspond to the commands in the batch, which are ordered
     * according to the order in which they were added to the batch.
       返回的陣列中每個整型值都是排過序的,它們的順序和批量處理中的命令們是一致的,
       命令的順序是按照它們被加到批處理中的順序一致。
     * The elements in the array returned by the method <code>executeBatch</code>
     * may be one of the following:
       executeBatch方法返回的陣列中的元素可能是下面幾種情形之一:
     * <OL>
     * <LI>A number greater than or equal to zero -- indicates that the
     * command was processed successfully and is an update count giving the
     * number of rows in the database that were affected by the command's
     * execution
       一個大於或等於零的數字,簡單說來命令成功執行後就返回它所影響到的行的數目
     * <LI>A value of <code>SUCCESS_NO_INFO</code> -- indicates that the command was
     * processed successfully but that the number of rows affected is
     * unknown
       
      * The constant indicating that a batch statement executed successfully
      * but that no count of the number of rows it affected is available.
      int SUCCESS_NO_INFO = -2;
      常量SUCCESS_NO_INFO代表的值=-2,也就是說命令執行成功了但命令影響到的行數
      無法統計,是未知的,只能返回SUCCESS_NO_INFO來說明命令執行情況。
     * <P> * If one of the commands in a batch update fails to execute properly,
     * this method throws a <code>BatchUpdateException</code>, and a JDBC
     * driver may or may not continue to process the remaining commands in
     * the batch.
       如果批量處理時其中一個命令執行失敗,則會丟擲一個異常BatchUpdateException
       JDBC驅動可能會停止剩餘的命令,也可能繼續執行剩餘的命令。
     * However, the driver's behavior must be consistent with a
     * particular DBMS, either always continuing to process commands or never
     * continuing to process commands.
       不管怎樣,驅動要怎麼做取決於資料庫管理系統的細節,總是執行或總是不執行兩者其一。
     * If the driver continues processing
     * after a failure, the array returned by the method
     * <code>BatchUpdateException.getUpdateCounts</code>
     * will contain as many elements as there are commands in the batch, and
     * at least one of the elements will be the following:
       發生失敗後如果驅動繼續執行,通過BatchUpdateException.getUpdateCounts()方法返回
       的陣列應該包括批處理中有的那些命令的結果,並且至少有一個元素的值是下面的情況:
     * <P>
     * <LI>A value of <code>EXECUTE_FAILED</code> -- indicates that the command failed
     * to execute successfully and occurs only if a driver continues to
     * process commands after a command fails
           int EXECUTE_FAILED = -3;
           指示命令沒有成功執行的常量值EXECUTE_FAILED,並且只有在命令出錯後驅動繼續執行的情況下才會出現,
           如果出錯後不再執行,則返回的結果中沒有錯誤資訊只有那些被成功執行後的結果。
     * </OL>
     * <P> * A driver is not required to implement this method.
     * The possible implementations and return values have been modified in
     * the Java 2 SDK, Standard Edition, version 1.3 to
     * accommodate the option of continuing to proccess commands in a batch
     * update after a <code>BatchUpdateException</code> obejct has been thrown.
       驅動不實現此方法,可能會出現的實現和返回值在Java 2 SDK,Standard Edition,
       version 1.3 ,以適應批處理時丟擲BatchUpdateException 異常後是繼續執行還是
       終止執行的選項。
      
     * @return an array of update counts containing one element for each
     * command in the batch. The elements of the array are ordered according
     * to the order in which commands were added to the batch.
       返回一個和新增命令時的順序一樣的陣列結果
     * @exception SQLException if a database access error occurs or the
     * driver does not support batch statements. Throws {@link BatchUpdateException}
     * (a subclass of <code>SQLException</code>) if one of the commands sent to the
     * database fails to execute properly or attempts to return a result set.
     * @since 1.3
     */
       如果資料庫訪問異常或驅動不支援批處理命令,或者如果一個命令傳送到資料庫時失敗或嘗試取得結果集
       時失敗,都會拋一個異常BatchUpdateException 它是SQLException的子類。

相關推薦

JDBC batch處理Statement executeBatch

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

window處理bat命令

前言 批處理檔案(batch file)包含一系列 DOS命令,通常用於自動執行重複性任務。使用者只需雙擊批處理檔案便可執行任務,而無需重複輸入相同指令。編寫批處理檔案非常簡單,但難點在於確保一切按順序執行。編寫嚴謹的批處理檔案可以極大程度地節省時間,在應對重

windows bat (處理)——IF

摘要:本文介紹了windows bat中IF語句的語法,包括3中基本形勢和擴充套件IF語句 1. IF & IF not if  和 if not 有都有3中形勢: IF [NOT] ERR

windows bat(處理)——IF

摘要:本文介紹了windows bat中IF語句的語法,包括3中基本形勢和擴充套件IF語句 1. IF & IF not if  和 if not 有都有3中形勢: IF [NOT] ERRORLEVEL number do command  IF [N

Spring batch學習 持久化表結構(2)

true fig 序列化 roc col id字段 exce har class #接上一篇 這一篇講一下持久化需要表 batch_job_execution, batch_job_execution_context, batch_job_execution_pa

使用JDBC連接數據庫

found 註冊 加載驅動 創建數據庫 delete ole red dsta 庫存 JDBC連接數據庫詳細流程 ?創建一個以JDBC連接數據庫的程序,包含7個步驟: 1、加載JDBC驅動程序: 在連接數據庫之前,首先要加載想要連接的數據庫的驅

java基礎之JDBC一:概述及步驟

etx fileread 操作 [] 全路徑 api mysql edi lean 1. JDBC的簡介 概述: 就是Java用來操作不同數據庫(DBMS)的類庫(技術), 本質就是一些類和接口. /* 類: Dri

異常處理與MiniDump 1 C++異常

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

玩轉MySQL -----JDBC處理

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

個人經驗~mysql故障處理思路~磁碟

 一 簡介 談談磁碟IO的問題二 目的:如何進行IO效能問題的排查 二  linux角度   一 基本定義       尋道時間,表示磁頭在不同磁軌之間移動的時間。       旋轉延遲,

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

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

#Python中字串的處理方法例項

字串的處理方法 1.eval(str) 功能:將字串str當成有效的表示式來求值並返回計算結果。 num1 = eval("123.1") print(num1) #(輸出)123.1 print(type(num1)) #(輸出)<class

【NLP】中文處理前提--jieba

介紹 \quad\quad在自然語言處理中,中文處理技術比西文處理技術要落後很大一段距離,許多西文的處理方法中文不能直接採用,就是因為中文必需有分詞這道工序。 \quad\quad當我們進行自然語言處理

JDBC元資料操作-- DatabaseMetaData介面

package com.util;   import java.sql.CallableStatement;   import java.sql.Connection;   import java.sql.DatabaseMetaData;   import java.sql.DriverMana

異常處理與MiniDump 4 MiniDump

程式崩潰的問題解決了,問題是,有很多時候,很多程式是不允許隨便崩潰的,這樣,在程式崩潰後再去發現問題就有些晚了,那麼,有沒有程式不崩潰時也能發現問題的方法呢?前面描述的SEH就是一種讓程式不崩潰的方法,不過在那種方式下,按以前描述的方法,崩潰是不崩潰了,但是實際上,掩蓋了很多問題,對於問題的發現有些不利的地方

sharding-jdbc讀寫分離的使用

一、不使用Spring 1、引入Maven依賴 <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-core</a

異常處理與MiniDump【轉帖】

(1) C++異常 一、   綜述 我很少敢為自己寫的東西弄個詳解的標題,之所以這次敢於這樣,自然還算是有點底氣的。並且也以此為動力,督促自己好好的將這兩個東西研究透。 當年剛開始工作的時候,第一個工作就是學習breakpad的原始碼,然後瞭解其原理,為公司寫一個ExceptionHandle的庫,以處理伺

DBUtils 框架的中batch處理使用

一、DBUtils 框架的使用     1、使用 dbutils 做增刪改查,批處理以及大文字操作     2、使用 DBUtils 框架管理事務。 (模擬銀行轉賬) 二、使用 JDBC 操作多個表     1、一對多(部門與員工)     2、多對多(學生和老師 學生與

R|資料處理|merge資料

作者簡介Dwzb , R語言中文社群專欄作者,廈門大學統計專業學生。知乎專欄:https://z

影象處理中梯度 及gradient()函式

影象在計算機中以數字影象的形式儲存,即以數值矩陣的形式存在,形成了離散的數值訊號,在此基礎上,對於影象處理中的數值的多樣性計算分析也影響著初步影象分析。影象梯度的定義:影象函式f(x,y)在點(x,y)的梯度是一個具有大小和方向的向量,設為Gx 和 Gy 分別表示x方向和y方