iBatis框架batch處理優化

在JDBC中如何做batch處理

    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();


iBatis框架對batch處理的支持

    iBatis框架對batch處理提供了很好的支持,底層的實現方式就是JDBC。下面看一段示例代碼:


    private void execute(SqlMapClient client){
        if(log.isDebugEnabled()){
            log.debug("execute start...");
        }

        client.startBatch();
        
        for(int i=0;i<2000;i++){

            client.delete("delete from order where id=?",i);
            
        }

        client.executeBatch();

        if(log.isDebugEnabled()){
            log.debug("execute end...");
        }
    }

資料引用:http://www.knowsky.com/362200.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章