??xml version="1.0" encoding="utf-8" standalone="yes"?>久久在线免费观看,欧美日韩在线第一页,亚洲va天堂va国产va久http://www.aygfsteel.com/pdw2009/archive/2008/02/28/182601.html有猫怼的日?/dc:creator>有猫怼的日?/author>Thu, 28 Feb 2008 01:53:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2008/02/28/182601.htmlhttp://www.aygfsteel.com/pdw2009/comments/182601.htmlhttp://www.aygfsteel.com/pdw2009/archive/2008/02/28/182601.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/182601.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/182601.htmlFrom Hibernate EntityManager:
  • hibernate-entitymanager.jar
  • lib/hibernate-annotations.jar
  • lib/hibernate-commons-annotations.jar
  • lib/jboss-archive-browsing.jar
  • From Hibernate Core
    • hibernate3.jar
    • lib/antlr-2.7.6.jar
    • lib/asm-attrs.jar
    • lib/asm.jar
    • lib/c3p0-0.9.1.jar
    • lib/cglib-2.1.3.jar
    • lib/commons-collections-2.1.1.jar
    • lib/commons-logging-1.0.4.jar
    • lib/concurrent-1.3.2.jar
    • lib/dom4j-1.6.1.jar
    • lib/ehcache-1.2.3.jar
    • lib/javassist.jar
    • lib/log4j-1.2.11.jar


  • ]]>
    hibernate复习随记http://www.aygfsteel.com/pdw2009/archive/2007/11/01/157613.html有猫怼的日?/dc:creator>有猫怼的日?/author>Thu, 01 Nov 2007 14:27:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2007/11/01/157613.htmlhttp://www.aygfsteel.com/pdw2009/comments/157613.htmlhttp://www.aygfsteel.com/pdw2009/archive/2007/11/01/157613.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/157613.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/157613.html

    ]]>
    Ibatis学习随笔http://www.aygfsteel.com/pdw2009/archive/2007/01/04/91844.html有猫怼的日?/dc:creator>有猫怼的日?/author>Thu, 04 Jan 2007 13:31:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2007/01/04/91844.htmlhttp://www.aygfsteel.com/pdw2009/comments/91844.htmlhttp://www.aygfsteel.com/pdw2009/archive/2007/01/04/91844.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/91844.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/91844.html阅读全文

    ]]>
    iBatis框架batch处理优化 (?http://www.aygfsteel.com/pdw2009/archive/2006/12/18/88554.html有猫怼的日?/dc:creator>有猫怼的日?/author>Mon, 18 Dec 2006 07:11:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2006/12/18/88554.htmlhttp://www.aygfsteel.com/pdw2009/comments/88554.htmlhttp://www.aygfsteel.com/pdw2009/archive/2006/12/18/88554.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/88554.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/88554.htmlZ么要做batch处理    

        q个问题我就不解释了Q因为我想你们肯定能?br />
    我解释的更好Q如果你真的不知道,那就到Google上去?br />
    索一下吧?br />
    Oracle回滚D?/b>

        q个问题偶也不很明白Q只是大概有个了解,?br />
    果你是这斚w的专Ӟ或者对q方面有比较q理解Q?br />
    别忘了跟偶分享哦?br />
    在JDBC中如何做batch处理

        JDBC提供了数据库batch处理的能力,在数据大扚w操作Q新增、删除等Q的情况下可以大q度提升pȝ的性能。我以前接触的一个项目,在没有采用batch处理Ӟ删除5万条数据大概要半个小时左叻I后来对系l进行改造,采用了batch处理的方式,删除5万条数据基本上不会超q?分钟。看一DJDBC代码Q?br />
    1. // 关闭自动执行
    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. // 提交一批要执行的更新命?/font>
    8. int[] updateCounts = stmt.executeBatch();



        本例中禁用了自动执行模式Q从而在调用 Statement.executeBatch() 时可以防止 JDBC 执行事务处理。禁用自动执行得应用程序能够在发生错误及批处理中的某些命o不能执行时决定是否执行事务处理。因此,当进行批处理更新Ӟ通常应该关闭自动执行?br />
        在JDBC 2.0 中,Statement 对象能够C可以一h交执行的命o列表。创句时Q与它关联的命o列表为空。Statement.addBatch() Ҏ用语句的命o列表d一个元素。如果批处理中包含有试图q回l果集的命oQ则当调用 Statement. executeBatch() Ӟ抛出 SQLException。只有 DDL 和 DML 命oQ它们只q回单的更新计数Q才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句?br />造的命o批处理,则可以调用方法 Statement.clearBatch()Q以上没有显C)来重新设|批处理?br />
        Statement.executeBatch() Ҏ把命o批处理提交给基本 DBMS 来执行。命令的执行依照在批处理中的添加顺序来q行。ExecuteBatch() 为执行的命oq回更新计数数组。数l中对应于批处理中的每个命o都包含了一,而数l中各元素依据命令的执行序Q这q是和命令的最初添加顺序相同)来排序。调用executeBatch() 关闭发用的 Statement 对象的当前结果集Q如果有一个结果集是打开的)。executeBatch() q回后,重新将语句的内部批处理命o列表讄为空?br />
        如果批处理中的某个命令无法正执行,则 ExecuteBatch() 抛出BatchUpdateException。可以调用BatchUpdateException.getUpdateCounts() Ҏ来ؓ批处理中成功执行的命令返回更新计数的整型数组。因为当有第一个命令返回错误时QStatement.executeBatch() ׃止,而且q些命o是依据它们在批处理中的添加顺序而执行的。所以如果 BatchUpdateException.getUpdateCounts() 所q回的数l包含 N 个元素,q就意味着在调用 executeBatch() 时批处理中的前 N 个命令被成功执行。用PreparedStatement 可以象下面这样写代码Q?br />
    1. // 关闭自动执行
    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. // 提交要执行的批处?/font>
    9. int[] updateCounts = stmt.executeBatch();



    iBatis框架对batch处理的支?/b>

        iBatis框架对batch处理提供了很好的支持Q底层的实现方式是JDBC。下面看一D늤例代码:

    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.     }


    iBatis框架做batch处理的问?/b>

        在一个batch中只能对一个表q行操作Q例如插入或删除。当有多个表需要处理时Q只能放在多个batch中进行处理。看下面的一D代码:
    1.     private void execute(int from,int to,List list){
    2.         if(log.isDebugEnabled()){
    3.             log.debug("STRGHousekeepTask execute start...");
    4.         }
    5.         HKSqlMapWrapper sqlWrapper = HKSqlMapWrapper.newInstance();
    6.         sqlWrapper.startBatch();
    7.         
    8.         for(int i=from;i<to;i++){
    9.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR_BL,list.get(i));
    10.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR,list.get(i));
    11.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_CNTR,list.get(i));
    12.         }
    13.         sqlWrapper.execBatch();
    14.         if(log.isDebugEnabled()){
    15.             log.debug("STRGHousekeepTask execute end...");
    16.         }
    17.     }
                                                代码1

        q段代码的目的就是要删除数据库中3个表的数据,sqlWrapper是iBatis的SqlMapClient的一个包装器Q主要是状对事物的控制。当ҎQ既to-from的|很小的时候,q样写是没有问题的。尽这D代码的本意是要享受batch处理带来的好处,但是事实上这D代码ƈ不会真正辑ֈ预期的效果,至于原因Q我们一会在q行分析★R我们先来看下面一D代码:
    1.     private void execute(int from,int to,List list){
    2.         if(log.isDebugEnabled()){
    3.             log.debug("STRGHousekeepTask execute start...");
    4.         }
    5.         HKSqlMapWrapper sqlWrapper = HKSqlMapWrapper.newInstance();
    6.         sqlWrapper.startBatch();
    7.         
    8.         for(int i=from;i<to;i++){
    9.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR_BL,list.get(i));
    10.         }
    11.         for(int i=from;i<to;i++){
    12.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR,list.get(i));
    13.         }
    14.         for(int i=from;i<to;i++){
    15.             sqlWrapper.delete(STRGHousekeepConstants.DELETE_CNTR,list.get(i));
    16.         }
    17.         sqlWrapper.execBatch();
    18.         if(log.isDebugEnabled()){
    19.             log.debug("STRGHousekeepTask execute end...");
    20.         }
    21.     }

                                                代码2

        正如你所看到的,和代?相比它只是做?ơ@环,每个循环执行一个表的操作。虽焉烦,但是却真正的享受Cbatch处理的好处!下面是时候解释一下这两段代码q后的秘密了★R?br />    在前面的章节里已l解释了JDBC如何做batch处理Q如果还不清楚的话请查看前面的章节。要解释q两D代码里面的玄机Q还得看一D代码☻下面的代码是从iBatis源码中提取的Q?br />
    1.     public void addBatch(RequestScope request, Connection conn, String sql, Object[] parameters  ) {
    2.       PreparedStatement ps = null;
    3.       if (currentSql != null
    4.           && sql.hashCode() == currentSql.hashCode()
    5.           && sql.length() == currentSql.length()) {
    6.         int last = statementList.size() - 1;
    7.         ps = (PreparedStatement) statementList.get(last);
    8.       } else {
    9.         ps = conn.prepareStatement(sql);
    10.         currentSql = sql;
    11.         statementList.add(ps);
    12.       }
    13.       request.getParameterMap().setParameters(request, ps, parameters);
    14.       ps.addBatch();
    15.       size++;
    16.     }

        q就是iBatis中batch处理的做法,在这里不惛_q段代码做一一解释Q有兴趣的可以自己查看一下iBatis的源码,我们只关心它如何对一条语句进行处理。参数sql是要q行batch处理的语句,parameters是sql的参数列表,如果sql和实例变量currentSql相等Q则从statementList列表里面得到一个PreparedStatementQ然后进行batch处理Q如果不{就新生成一个PreparedStatement对象Qƈ把它加到statementList列表里面Qƈ把当前sql的值附lcurrentSqlQ下ơ传递来sql的时候就会和q个新的currentSql比较。这是Z么在一个@环里面只对一个表q行处理的原因了。如果在一个@环里面对多个表进行处理,每次传给addBatchҎ的sql都是新的Q都会生成一个新的PreparedStatementQ所以也׃n受不到batch处理带来的好处了Q   ?br />
       按照代码1的方式执行程序,当batch size很小的时候尽n受不到batch处理带来的好处,但是也不至于会出什么大问题Q但是当batch size值很大的时候(我在E序中试验过1000-5000范围Q,数据库就会报错了Q错误是"too many courses"Q原因是每生成一个PreparedStatement实例Q就会相应的生成一个course。假设batch size?000Q要删除10个表的数据,那么产生的course的数目就?000*10=50000Q这Ҏ据库来说是不能接?br />的,所以就会报错?br />
        如果按照代码2的的方式写程序肯定是没有问题的,只会生成10个PreparedStatement实例Q相应的也只会生?0个courseQ这样就真正的n受到了batch处理带来的好处。但是,作ؓ一名“挑剔”的E序员,我们怎么能容忍这L写法呢?明明一个@环就可以搞定Q现在要分成10个@环来做,非但效率上存在问题,大量重复的代码也让我们的E序昑־很没“水准”?br />
        既然W一U方式不能n受batch处理带来的好处,q且q会出错Q第二种方式代码又非常的丑陋Q那么我们就得想个办法来解决q个问题了。请CQ解决问题的q程是一Un受☻?br />
    修改底层代码Q支持多表batch处理

        既然出问题的地方扑ֈ了,那么解决它就很容易了。什?你说q不知道问题出在哪?My God! Kill me ,pleale☻! 

        在这里分享一下我的思\Q把每次传近来的sql作ؓkey、把生成的PreparedStatement实例作ؓvalue攑֜一个Map里以后每ơ传来sql时先判断在Map里有没有q个keyQ如果有q接拿到它的value作ؓPreparedStatement实例Q如果没有就新生成一个PreparedStatement实例q把它放到Map里。这h几个sql有几个PreparedStatement
    实例Q和写多个@环效果是一L。但写一个@环会更爽☻! 

    后记Q?br />
          在一般的目中做batch处理的地方似乎都是先取得一个条件列表listQ然后直接根据这个list的大作为batch size做一个@环。如果你在这个@环里同时q行多个表的QUQ操作,那么q里有一个安全隐患存在。当你的list不太大的时候,你怎么试E序它都不会出问题,管可能会有执行效率上的问题Q但是当H然有一天这个list变的很大的时候,你的E序可能q然“Ş工”了。?br />
      对于q个问题Q我在上面的文档里提Z改进batch处理的方法,另外q有需要注意的一个问题就是这个list的大的问题。如果这个list的size有可能会很大Q那么我们应该考虑Ҏq个list的大“分批”执行。因为ƈ不是batch size大效果p好,如果batch的size很大的话很可能生效率和性能上的问题。至于这个batch size的gؓ多少比较合适就没有一个固定的说法Q这个可能要取决于你所使用的服务器和数据库的性能了,另外不同厂商的JQQ驱动也会有不同的性能表现Q你可以向DQA咨询相关的问题。?br />
      我们应该可能把问题扼杀在摇之中。除了改qiQatis的batch处理机智外,q应该适当的规划batch size大小Q以避免发生问题Q提高执行效率。?br />
      上述是我个h的观点,有些地方可能不是很准。如果你的程序中存在cM的问题,可以适当参考一下我的意见,最好还是向专业人士咨询?/font>

    ]]>
    վ֩ģ壺 | | ݰ| ʯʨ| | | | ľ| | | | | û| | | »| | | | | | | | ³| | | گ| ¡| | dz| Ӷ| | ³| ĺ| | Խ| ֵ| | ƺ| ָ| |