论坛首页 Java企业应用论坛

ibatis的批处理

浏览 11177 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-21  

(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

   发表时间:2010-03-17  
最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。
0 请登录后投票
   发表时间:2010-03-17  
allengao 写道
最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。


使用batch会用到很多cursor. 容易造成cursor耗尽。
0 请登录后投票
   发表时间:2010-03-23   最后修改: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
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics