国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

iBatis框架batch處理優(yōu)化

2019-11-18 15:28:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
為什么要做batch處理    

    這個(gè)問(wèn)題我就不解釋了,因?yàn)槲蚁肽銈兛隙鼙?br />
我解釋的更好!假如你真的不知道,那就到雅虎上去搜

索一下吧?

Oracle回滾段

    這個(gè)問(wèn)題偶也不很明白,只是大概有個(gè)了解,如

果你是這方面的專(zhuān)家,或者對(duì)這方面有比較深的理解,

別忘了跟偶分享哦?

在JDBC中如何做batch處理

    JDBC提供了數(shù)據(jù)庫(kù)batch處理的能力,在數(shù)據(jù)大批量操作(新增、刪除等)的情況下可以大幅度提升系統(tǒng)的性能。我以前接觸的一個(gè)項(xiàng)目,在沒(méi)有采用batch處理時(shí),刪除5萬(wàn)條數(shù)據(jù)大概要半個(gè)小時(shí)左右,后來(lái)對(duì)系統(tǒng)進(jìn)行改造,采用了batch處理的方式,刪除5萬(wàn)條數(shù)據(jù)基本上不會(huì)超過(guò)1分鐘。看一段JDBC代碼:
  1. // 關(guān)閉自動(dòng)執(zhí)行
  2. con.setAutoCommit(false);
  3. Statement stmt = con.createStatement();
  4. stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
  5. stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
  6. stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");
  7. // 提交一批要執(zhí)行的更新命令
  8. int[] updateCounts = stmt.executeBatch();


    本例中禁用了自動(dòng)執(zhí)行模式,從而在調(diào)用 Statement.executeBatch() 時(shí)可以防止 JDBC 執(zhí)行事務(wù)處理。禁用自動(dòng)執(zhí)行使得應(yīng)用程序能夠在發(fā)生錯(cuò)誤及批處理中的某些命令不能執(zhí)行時(shí)決定是否執(zhí)行事務(wù)處理。因此,當(dāng)進(jìn)行批處理更新時(shí),通常應(yīng)該關(guān)閉自動(dòng)執(zhí)行。

    在JDBC 2.0 中,Statement 對(duì)象能夠記住可以一起提交執(zhí)行的命令列表。創(chuàng)建語(yǔ)句時(shí),與它關(guān)聯(lián)的命令列表為空。Statement.addBatch() 方法為調(diào)用語(yǔ)句的命令列表添加一個(gè)元素。假如批處理中包含有試圖返回結(jié)果集的命令,則當(dāng)調(diào)用 Statement. executeBatch() 時(shí),將拋出 SQLException。只有 DDL 和 DML 命令(它們只返回簡(jiǎn)單的更新計(jì)數(shù))才能作為批處理的一部分來(lái)執(zhí)行。假如應(yīng)用程序決定不提交已經(jīng)為某語(yǔ)句構(gòu)
造的命令批處理,則可以調(diào)用方法 Statement.clearBatch()(以上沒(méi)有顯示)來(lái)重新設(shè)置批處理。

    Statement.executeBatch() 方法將把命令批處理提交給基本 DBMS 來(lái)執(zhí)行。命令的執(zhí)行將依照在批處理中的添加順序來(lái)進(jìn)行。ExecuteBatch() 為執(zhí)行的命令返回更新計(jì)數(shù)數(shù)組。數(shù)組中對(duì)應(yīng)于批處理中的每個(gè)命令都包含了一項(xiàng),而數(shù)組中各元素依據(jù)命令的執(zhí)行順序(這還是和命令的最初添加順序相同)來(lái)排序。調(diào)用executeBatch() 將關(guān)閉發(fā)出調(diào)用的 Statement 對(duì)象的當(dāng)前結(jié)果集(假如有一個(gè)結(jié)果集是打開(kāi)的)。executeBatch() 返回后,將重新將語(yǔ)句的內(nèi)部批處理命令列表設(shè)置為空。

    假如批處理中的某個(gè)命令無(wú)法正確執(zhí)行,則 ExecuteBatch() 將拋出BatchUpdateException。可以調(diào)用BatchUpdateException.getUpdateCounts() 方法來(lái)為批處理中成功執(zhí)行的命令返回更新計(jì)數(shù)的整型數(shù)組。因?yàn)楫?dāng)有第一個(gè)命令返回錯(cuò)誤時(shí),Statement.executeBatch() 就中止,而且這些命令是依據(jù)它們?cè)谂幚碇械奶砑禹樞蚨鴪?zhí)行的。所以假如 BatchUpdateException.getUpdateCounts() 所返回的數(shù)組包含 N 個(gè)元素,這就意味著在調(diào)用 executeBatch() 時(shí)批處理中的前 N 個(gè)命令被成功執(zhí)行。用PReparedStatement 可以象下面這樣寫(xiě)代碼:

  1. // 關(guān)閉自動(dòng)執(zhí)行
  2. con.setAutoCommit(false);
  3. PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");
  4. stmt.setInt(1, 2000);
  5. stmt.setString(2, "Kelly Kaufmann");
  6. stmt.addBatch();
  7. ???
  8. // 提交要執(zhí)行的批處理
  9. int[] updateCounts = stmt.executeBatch();


iBatis框架對(duì)batch處理的支持

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

  1.     private void execute(SqlMapClient client){
  2.         if(log.isDebugEnabled()){
  3.             log.debug("execute start...");
  4.         }
  5.         client.startBatch();
  6.         
  7.         for(int i=0;i<2000;i++){
  8.             client.delete("delete from order where id=?",i);
  9.             
  10.         }
  11.         client.executeBatch();
  12.         if(log.isDebugEnabled()){
  13.             log.debug("execute end...");
  14.         }
  15.     }



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤庆县| 安丘市| 信丰县| 敖汉旗| 耿马| 同江市| 延吉市| 九寨沟县| 繁昌县| 敦化市| 抚州市| 吴江市| 庐江县| 北宁市| 和田市| 宜州市| 汽车| 龙口市| 涿鹿县| 广安市| 海兴县| 鄱阳县| 德昌县| 周至县| 抚顺市| 滨州市| 巨野县| 罗甸县| 德化县| 五河县| 台中市| 疏勒县| 峨眉山市| 株洲县| 田林县| 军事| 凉山| 新营市| 泽库县| 安国市| 曲靖市|