浏览 11177 次
锁定老帖子 主题:ibatis的批处理
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-21
(1)spring模式:尽管spring已经配置了事务,但以下代码中还是要设置事务,不然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(); } } 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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-17
最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。
|
|
返回顶楼 | |
发表时间:2010-03-17
allengao 写道 最后批量插的做法是很容易outmemory的,因为iBATIS源码中的批量算法优化不足,所以会同时产程大量的预处理对象,不过可自信修改源码即可。
使用batch会用到很多cursor. 容易造成cursor耗尽。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |