`
dengminhui
  • 浏览: 167937 次
  • 来自: ...
社区版块
存档分类
最新评论

ibatis的批处理

阅读更多

(1)spring模式:尽管spring已经配置了事务,但以下代码中还是要设置事务,不然batch不会起作用;另外这里虽然设了一下事务处理,但对全局事务并不会造成影响;
注:不启用事务将建立多次连接,这表示batch没起作用,建立事务后一次连接就搞定了.

public void batchAddExamlog(List examlogList) throws SQLException{                 
    SqlMapClient smc=this.getSqlMapClient();                                         
    try {                                                                            
        smc.startTransaction();                                                        
        smc.startBatch();                                                              
                                                                                                                                                       
        for (Iterator iter = examlogList.iterator(); iter.hasNext();) {
            Examlog log = (Examlog) iter.next();
            smc.update("insertExamlog", log);
        }                                                                            
        smc.executeBatch();                                                            
    } catch (Exception e) {                                                          
        // TODO: handle exception                                                      
    }finally{                                                                        
        smc.commitTransaction();                                                       
        smc.endTransaction();                                                          
    }                                                                                
}  

                                                                                

(2)直接采用回调函数设置                                                                             

public void batchAddExamlog2(List examlogList){                                    
    getSqlMapClientTemplate().execute(new SqlMapClientCallback() {                   
        public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
         executor.startBatch();                                                      
         executor.update("insertSomething", "myParamValue");                         
         executor.update("insertSomethingElse", "myOtherParamValue");                
         executor.executeBatch();                                                    
         return null;                                                                
        }                                                                            
    });                                                                            
}

 

 

 

转载于:http://hi.baidu.com/zjphzxg/blog/item/7e17cf0f357f14e4aa645722.html

分享到:
评论
3 楼 yin_bp 2010-03-23  
有空看看开源bbossgroups项目bboss-taglib框架中提供的执行预编译/普通批处理操作标签,很实用也很简单:
bbossgroups项目下载地址:
https://sourceforge.net/projects/bboss/files/
相关的子项目:
bboss-taglib(标签库框架)
http://sourceforge.net/projects/bboss/files/bbossgroups-1.0/bboss-taglib.zip/download
bboss-persistent(持久层框架)
http://sourceforge.net/projects/bboss/files/bbossgroups-1.0/bboss-persistent.zip/download


执行预编译/普通批处理操作标签使用

相关的一组标签:batchutil,statement,batch,sqlparam
通过这组标签我们可以实现以下功能:

       普通批处理操作

       预编译批处理操作

下面详细说明上述功能。

1.1.1   普通批处理操作
<%@ page contentType="text/html; charset=GBK" language="java"%>
1.1.1.1             导入标签定义文件

<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%>
<!--
    batchutil标签实现数据库批处理操作
    statement:指定批处理语句
    dbname:批处理语句执行的对应的数据库连接池名称,在poolman.xml文件中进行配置

   
-->
1.1.1.2             定义一组要进行批处理操作的sql语句
<%  String sql = "update sqltest set batch='1' where object_id=1";
    String sql1 = "update sqltest set batch='2' where object_id=1";
    String sql2 = "update sqltest set batch='3' where object_id=1";
    String sql3 = "update sqltest set batch='4' where object_id=1";
    String sql4 = "update sqltest set batch='5' where object_id=1";
%>
<html>
    <head>
       <title>测试在batchutil标签上直接执行数据库批处理操作</title>
    </head>
    <body>
       <table>
1.1.1.3             使用batchutil标签执行批处理操作

           <pg:batchutil dbname="bspf" type="common">
              <pg:statement sql="<%=sql %>" />
              <pg:statement sql="<%=sql1 %>" />
              <pg:statement sql="<%=sql2 %>" />            
              <pg:statement sql="<%=sql3 %>" />
              <pg:statement sql="<%=sql4 %>" />
           </pg:batchutil>
       </table>
    </body>
</html>

1.1.2   预编译批处理操作
<%@ page contentType="text/html; charset=GBK" language="java"%>
1.1.2.1             导入标签定义文件
<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%>
<!--
    batchutil标签实现数据库预编译批处理操作
    statement:指定预编译批处理语句
    dbname:预编译批处理语句执行的对应的数据库连接池名称,在poolman.xml文件中进行配置

   
-->
1.1.2.2             定义一组要进行预编译批处理操作的sql语句和参数组
预编译批处理操作可以是多条不同的预编译sql语句,也可以是同一条sql语句的多个不同的绑定变量参数组,也可以是混合的情况。下面我们使用一条sql语句和5组不同的绑定参数的情况做为示例来说明各种不同的情况。
<%
    String object_id = "1";

    String created = "2010-03-12 12:43:54";
    String created1 = "2010-03-13 12:43:54";
    String created2 = "2010-03-14 12:43:54";
    String created3 = "2010-03-15 12:43:54";
    String created4 = "2010-03-16 12:43:54";

    String sql = "update sqltest set created=#[created] where object_id=#[object_id]";
%>
<html>
    <head>
       <title>测试在batchutil标签上直接执行数据库预编译批处理操作</title>
    </head>
    <body>
       <table>
1.1.2.3             使用batchutil标签执行预编译批处理操作
           <pg:batchutil dbname="bspf" type="prepared">
              <pg:statement sql="<%=sql %>" pretoken="#\\[" endtoken="\\]">
1.1.2.3.1   多组不同的参数用batch标签来组织
                  <pg:batch>
                     <pg:sqlparam name="object_id" value="<%=object_id %>" type="int" />
                     <pg:sqlparam name="created" value="<%=created %>" type="timestamp" />
                  </pg:batch>
              </pg:statement>
              <pg:statement sql="<%=sql %>" pretoken="#\\[" endtoken="\\]">
                  <pg:batch>
                     <pg:sqlparam name="object_id" value="<%=object_id %>" type="int" />
                     <pg:sqlparam name="created" value="<%=created1 %>"
                         type="timestamp" />
                  </pg:batch>
              </pg:statement>
              <pg:statement sql="<%=sql %>" pretoken="#\\[" endtoken="\\]">
1.1.2.3.2   如果只有一组参数,那么不需要使用batch标签

                  <pg:sqlparam name="object_id" value="<%=object_id %>" type="int" />
                  <pg:sqlparam name="created" value="<%=created2 %>" type="timestamp" />

              </pg:statement>
              <pg:statement sql="<%=sql %>" pretoken="#\\[" endtoken="\\]">
                  <pg:batch>
                     <pg:sqlparam name="object_id" value="<%=object_id %>" type="int" />
                     <pg:sqlparam name="created" value="<%=created3 %>"
                         type="timestamp" />
                  </pg:batch>
                  <pg:batch>
                     <pg:sqlparam name="object_id" value="<%=object_id %>" type="int" />
                     <pg:sqlparam name="created" value="<%=created4 %>"
                         type="timestamp" />
                  </pg:batch>
              </pg:statement>
           </pg:batchutil>
       </table>
    </body>
</html>

如果要引入事务的话,可以在执行sql的标签代码的外围包一个事务即可使用的方法如下:
import com.frameworkset.orm.transaction.TransactionManager;
<%

                TransactionManager tm =  new TransactionManager();
                try
                {
                        tm.begin();//开始事务
                       %>

                            放置操作数据库的标签代码
                       <%
                        tm.commit();//提交事务
                       
                }
                catch(Exception e)
                {
                        try {
                                tm.rollback();//回滚事务
                        } catch (RollbackException e1) {
                               
                                e1.printStackTrace();
                        }
                }
                %>

详细信息,请看博文:
http://blog.csdn.net/yin_bp/archive/2010/03/19/5397653.aspx
2 楼 guanliScott 2010-03-17  
allengao 写道
最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。


使用batch会用到很多cursor. 容易造成cursor耗尽。
1 楼 allengao 2010-03-17  
最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。

相关推荐

    ibatis批处理.doc

    尽管Spring已经配置了事务管理,但在实际使用iBATIS批处理时,仍需要在代码中显式地开启和提交事务。这是因为iBATIS的批处理需要在一个事务内执行,才能确保所有操作作为一个整体执行。例如,下面的代码展示了如何在...

    iBatis批处理

    程序员的素养 程序员在工作中经常会遇到各式各样的问题和挑战,要想成为一名优秀的程序员,不仅需要具备扎实的技术能力,还需要有良好的职业素养。本文将围绕程序员的四大核心素养展开讨论,分别是:定位、主动、...

    ibatis批处理

    iBatis 批处理是一种高效的数据操作方式,尤其在处理大量数据时,可以显著提高性能。iBatis 提供了两种批处理的实现方法:在代码中直接进行循环操作和在配置文件中进行循环操作。 **1. 直接在代码中进行循环操作** ...

    ibatis的两种方式实现批处理.doc

    iBatis批处理实现方式浅析 iBatis是一个功能强大的持久层框架,提供了多种方式来实现批处理操作。批处理是指将多个SQL语句组合成一个批处理单元,然后将其执行到数据库中,以提高数据库操作的效率。在iBatis中,...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,将数据库操作与业务逻辑解耦,使得开发者可以更专注于业务逻辑的实现,而无需关心繁琐的SQL语句编写。本篇文章将深入探讨Ibatis API、文档...

    ibatis教程,ibatis帮助文档

    1. SqlMapClient:它是iBATIS的主要接口,负责执行SQL映射和批处理操作。提供多种方法如queryForObject、queryForMap等,用于执行不同的查询或更新操作。 2. sqlmapconfig.xml:这是iBATIS的全局配置文件,包含了...

    ibatis应对批量update

    ### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往会导致效率低下。这是因为每一次循环都需要执行一次数据库连接操作,对于批量更新来说,这样的处理方式显然不够高效。为了解决这个问题,...

    ibatis批量处理

    iBatis提供了批处理功能,可以在一次数据库连接中执行多个SQL语句,这极大地提高了处理大量数据时的性能。iBatis通过`SqlMapClient`接口提供了几个关键方法来实现批处理: 1. **`startBatch()`**:开始批处理。 2. ...

    ibatis批量存储

    本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签、批处理、foreach标签以及如何在Ibatis中使用HashMap。 1. Iterate标签详解及应用: Ibatis的iterate标签主要...

    IBatis .NET框架实例

    通过合理的缓存策略、批处理和预编译SQL等手段,IBatis可以在不影响灵活性的同时提供良好的性能。 总结,IBatis .NET为.NET开发者提供了一种直观、灵活的方式来处理数据库操作。通过学习这个实例,你可以掌握如何...

    ibatis系列 详细介绍

    8. **性能优化**:提供一些关于提高iBATIS性能的建议,如合理设计SQL、使用批处理等。 《ibatis.pdf》可能是iBATIS的官方文档或综合指南,可能包含更广泛的内容,如最佳实践、高级特性、与其他框架的集成等。 ...

    ibatis基础教学文档

    1. SqlMapClient:它是iBATIS的主要接口,负责执行SQL映射和批处理操作。提供了如queryForObject、queryForMap等方法来执行查询或更新操作。 2. sqlmapconfig.xml:这是全局配置文件,定义了数据源、事务管理器等...

    ibatis jar包.zip

    9. **性能优化**:通过预编译SQL语句、批处理等技术,iBATIS能够有效地提高数据库操作的性能。 总之,"ibatis jar包.zip" 提供了使用iBATIS框架进行数据库访问所需的全部组件,使得开发者能够快速地构建数据驱动的...

    ibatis-common.jar包

    它提供了两种基本的执行模式:SimpleExecutor(简单执行器)和BatchExecutor(批处理执行器),前者每次执行一条SQL,后者则将多条SQL语句合并成一个批处理,提高效率。 4. **ParameterMap**与**ParameterMapping**...

    ibatis-2.3.0.677

    4. **Executor**:执行器接口,负责SQL语句的真正执行,它根据不同的策略实现如简单执行、批处理执行、缓存等不同模式。 5. **ParameterHandler**:参数处理器,将Java对象的参数转换为SQL语句所需的参数值。 6. *...

    ibatis in action 电子书(pdf)

    8. **高级话题**:涵盖与iBATIS相关的高级主题,如批处理、延迟加载、自定义类型处理器、插件扩展等,提升开发者对iBATIS框架的深度理解。 9. **最佳实践**:提供实用的项目开发建议,如如何设计合理的映射文件结构...

    ibatis的3个jar包.rar

    此外,它还支持事务管理和批处理,能够很好地适应大型项目的需求。在使用Ibatis时,开发者可以根据项目的规模和需求选择不同的集成方式,如Spring框架中的Ibatis整合,实现更高级的事务管理和依赖注入。 总的来说,...

    iBATIS_DAO-2.2.0.638

    7. **批处理操作**:对于批量数据操作,iBATIS提供了批处理API,可以大大提高效率。 8. **异常处理**:iBATIS将数据库操作过程中可能出现的异常进行了封装,提供了一套统一的异常处理机制。 使用iBATIS DAO 2.2.0....

    详细介绍Ibatis的用法

    - **批处理**:对于大量数据的插入或更新操作,可以使用批处理来提高效率。 - **执行SQL语句**:通过`SqlMapClient`接口提供的方法执行SQL语句。 #### 示例代码 - **执行更新操作**:使用`update`方法执行INSERT...

Global site tag (gtag.js) - Google Analytics