executeBatch()該如何運用?關於 executeBatch() 的詳解用法

2020-12-25 中華網

executeBatch()詳解

JDBC提供了資料庫batch處理的能力,在數據大批量操作(新增、刪除等)的情況下可以大幅度提升系統的性能。

// 關閉自動執行

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 命令(它們只返回簡單的更新計數)才能作為批處理的一部分來執行。如果應用程式決定不提交已經為某語句構

1

2

3

造的命令批處理,則可以調用方法 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 int 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 executeBatch

* may be one of the following:

executeBatch方法返回的數組中的元素可能是下面幾種情形之一:

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

一個大於或等於零的數字,簡單說來命令成功執行後就返回它所影響到的行的數目

A value of SUCCESS_NO_INFO – 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來說明命令執行情況。

* If one of the commands in a batch update fails to execute properly,

* this method throws aBatchUpdateException, 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

*BatchUpdateException.getUpdateCounts

* 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()方法返回

的數組應該包括批處理中有的那些命令的結果,並且至少有一個元素的值是下面的情況:

A value ofEXECUTE_FAILED-- 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,並且只有在命令出錯後驅動繼續執行的情況下才會出現,

如果出錯後不再執行,則返回的結果中沒有錯誤信息只有那些被成功執行後的結果。

* 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 aBatchUpdateExceptionobejct 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 ofSQLException) 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的子類。

責任編輯:kj005

文章投訴熱線:156 0057 2229 投訴郵箱:29132 36@qq.com

相關焦點

  • 《我的世界》execute怎麼使用 execute使用方法
    導 讀 我的世界execute怎麼使用?
  • Apex Batch和Apex Scheduler-定時批處理大量數據
    } global void execute(Database.BatchableContext bc, List<P> records){ // process each batch of records } global void finish(Database.BatchableContext bc
  • 《我的世界》execute指令使用方法 execute指令怎麼用
    ,下面小編就為大家講解一下execute指令怎麼才能用好。 今天小編就為大家解析一下我的世界命令方塊execute指令怎麼用,大家都知道我的世界1.8新出了一些指令,下面小編就為大家講解一下execute指令怎麼才能用好。希望此篇文章能幫到大家!
  • 我的世界命令方塊 用execute命令點石成金
    我的世界execute還有一種探測方塊執行的用法。下面18183小編為大家帶來詳細介紹。這種拓展用法就是:execute detect    看上去很繁瑣,實際上就是把原先的execute和testforblock進行了合體。
  • 我的世界execute命令的基礎使用方法
    execute最主要就是以一個或多個實體為中心執行一條指令,就像把原本寫在命令方塊中的指令賜予到實體身上。 其最簡單的用法就是:execute <實體的定義> <執行事件的x坐標> <執行事件的y坐標> <執行事件的z坐標> <事件指令> 這裡實體的定義指的是以什麼為中心,例如殭屍、末影龍,當然玩家也是實體,甚至閃電。玩家不用說了,我們可以直接用選擇器@a、@p、@r。
  • Batchnorm原理詳解
    本文旨在用通俗易懂的語言,對深度學習的常用算法--batchnorm的原理及其代碼實現做一個詳細的解讀。本文主要包括以下幾個部分。首先,此部分也即是講為什麼深度網絡會需要batchnorm,我們都知道,深度學習的話尤其是在CV上都需要對數據做歸一化,因為深度神經網絡主要就是為了學習訓練數據的分布,並在測試集上達到很好的泛化效果,但是,如果我們每一個batch輸入的數據都具有不同的分布,顯然會給網絡的訓練帶來困難。
  • 乾貨 | BatchNormalization詳解與比較
    Batch NormalizationbatchNormalization就像是名字一樣,對一個batch的數據進行normalization。現在假設一個batch有3個數據,每個數據有兩個特徵:(1,2),(2,3),(0,1)如果做一個簡單的normalization,那麼就是計算均值和方差,把數據減去均值除以標準差,變成0均值1方差的標準形式。
  • 法律翻譯中 execute a contract 到底什麼意思?
    釋義execute 作為動詞,基本意思為「執行」、「使生效」。在法律文書中,元照英美法詞典在線版(http://lawyer.get.com.tw/Dic/)顯示:舉例那麼,execute a contract 應該如何理解呢?是「執行合同」還是「籤署合同」,還是其他含義?李克興在《法律翻譯 譯.注.評》中表示:execute a contract or an instrument 指的是完成籤字、蓋章、交付等使契約、文件生效的必要手續。
  • Batch Normalization
    滿足常見的損失函數的選取有我們是如何訓練它的呢我們用mini-batch來逼近損失函數真實梯度為什麼要mini-batch?我們考慮一個mini-batch如何預測?接下來我們將BN神經網絡用來預測, 此時我們該如何體現batch的概念呢?( 圖源自吳恩達深度學習.)
  • Spring Batch 入門教程
    如果您想了解更多關於 SpringBatch的信息,請訪問Spring Batch教程頁面。1.Spring Batch框架工作原理在深入研究代碼之前,讓我們先看看 SpringBatch框架。最後, JobRepository存儲關於配置和執行的 Job(作業)的元數據。為了演示 SpringBatch是如何工作的,讓我們構建一個簡單的Hello World批處理作業。在本例中,我們 從person.csv文件中讀取一個人的姓和名。從這些數據生成一個問候語。然後將此問候語寫入 greeting.txt文件。
  • 法律英語∣Execute a contract為啥意思呢?
    舉例那麼,execute a contract 應該如何理解呢?是「執行合同」還是「籤署合同」,還是其他含義?李克興在《法律翻譯 譯.注.評》中表示:execute a contract or an instrument 指的是完成籤字、蓋章、交付等使契約、文件生效的必要手續。
  • asp檢測conn.execute是否執行成功的函數
    首頁 > 語言 > 關鍵詞 > asp最新資訊 > 正文 asp檢測conn.execute是否執行成功的函數
  • 詳解Batch Normalization及其反向傳播
    的mini-batch首先,由(2.1)和(2.2)得到mini-batch的均值和方差,之後進行(2.3)的歸一化操作,在分母加上一個小的常數是為了避免出現除0操作。(3.6)可以由式(2.1)直接得到,(3.7)是運用鏈式法則的結果。
  • 深入理解Batch Normalization
    LRN是一個非訓練層,即該層中不存在可訓練的參數。假設某一個CNN層的輸出為一個 WxHxC 的張量,要對該張量做LRN我們應該怎麼做呢。 的計算一定是有偏估計,這個時候我們該如何進行計算呢?利用BN訓練好模型後,我們保留了每組mini-batch訓練數據在網絡中每一層的
  • 學習率和batchsize如何影響模型的性能?
    學習率直接影響模型的收斂狀態,batchsize則影響模型的泛化性能,兩者又是分子分母的直接關係,相互也可影響,因此這一次來詳述它們對模型性能的影響。2 學習率如何影響模型性能?通常我們都需要合適的學習率才能進行學習,要達到一個強的凸函數的最小值,學習率的調整應該滿足下面的條件,i代表第i次更新。
  • Batch、Mini-batch和隨機梯度下降的區別和Python示例
    該方法雖然具有穩定的收斂性和穩定的誤差,但是該方法使用了整個機器學習訓練集,因此,對於大型機器學習數據集會非常慢。Mini-batch梯度下降想像一下,將您的數據集分成幾個batches。這樣,它就不必等到算法遍歷整個數據集後才更新權重和偏差,而是在每個所謂的Mini-batch結束時進行更新。
  • 如何利用Python實現SQL自動化?
    本文將為你展示如何操作。入棧數據結構defpush_dataframe(self, data, table="raw_data", batchsize=500): # create execution cursor cursor = self.cnxn.cursor() # activate fast execute
  • Batch Normalization原理與實戰(下)
    注意:在訓練過程中batch_size選了60(mnist.train.next_batch(60)),這裡是因為BN的原paper中用的60。可以發現,BN收斂速度非常之快,而沒有BN的網絡前期在不斷波動,直到第20000個train batch以後才開始進入平穩的訓練狀態。
  • 【精華】Batch Normalization理論與實踐
    這個時候我們可能就會想,如果在每一層輸入的時候,再加個預處理操作那該有多好啊,比如網絡第三層輸入數據X3(X3表示網絡第三層的輸入數據)把它歸一化至:均值0、方差為1,然後再輸入第三層計算,這樣我們就可以解決前面所提到的「Internal Covariate Shift」的問題了。
  • 我的世界:高級「魔法」教學——execute指令入門到進階攻略!
    我的世界關於對象後面的坐標:這個坐標一般情況下沒什麼用,通常都是~~~這個坐標具體指的就是指令中坐標系原點的位置。因此,使用execute變更執行者後,也有需要變更一個新的坐標原點。關於相對坐標:最簡單的填法自然就是~~~,也是最實用的填法,表示以選定執行者所在的位置為坐標原點。如果~後跟了數字,什麼意思呢?意思就是以執行者所在的位置為中心,偏移一定距離後得到的點作為坐標原點。