posts - 31,  comments - 31,  trackbacks - 0
1、上回的心得中我强调了startBatch()的批处理的作用,但是其中的使用是个错误用法,并没有发挥出startBatch()的实力,对此给与观众的误导我将在此表示到欠,并贴出正确的用法
public class LocalDaoImpl extends SqlMapClientDaoSupport implements LocalDao {

    
public void insertBuNaTaxBatLst(final PaginatedList list)
    
{
         getSqlMapClientTemplate().execute(
new SqlMapClientCallback() {
                
public Object doInSqlMapClient(SqlMapExecutor executor)
                        
throws SQLException {
                    executor.startBatch();
                    
// do some iBatis operations here
                    for(int i=0,count=list.size();i<count;i++)
                    
{    
                        executor.insert(
"insertBuNaTaxBatLst", list.get(i));
                        
if (i % 50 == 0{
                            System.out.println(
"----" + i);//没有意义只为测试
                        }

                    }

                    executor.executeBatch();
                    
return null;
                }

            }
);
    }


}
这样才能利用上startBatch()威力。
2、注意ibatis的事物默认情况下是自动提交的,如果发现速度上有问题可以留意一下,ibatis只有在显示的声明事物管理的情况下才自动将事物管理改为不自动方式。
3、还是startBatch(),据我测试分析这个鬼东西只有在executeBatch(),才把所有的语句提交到数据库,在提交之前缓存中保留了大量的sql语句和数据对象,很有可能out of memony,对此要留意,可以在大量数据要做插入时,分批用Batch,如:有40000条数据可将其分为4个Batch块,让后将这4个Batch用一个事物提交以保证数据完整性。
注:最近在做数据抽取项目,愿与大家沟通心得
posted on 2007-05-30 21:46 小平 阅读(5940) 评论(6)  编辑  收藏


FeedBack:
# re: Spring+ibatis批量存储心得 2
2008-01-16 17:43 | 岩石
非常的好,谢谢,受教了  回复  更多评论
  
# re: Spring+ibatis批量存储心得 2[未登录]
2008-06-04 00:29 | peter
学习  回复  更多评论
  
# re: Spring+ibatis批量存储心得 2
2008-11-05 10:48 | 菜虫
请问一下,对多张表同时进行批量插入也可以用这种方法吗?
执行插入多少条时去调用 executor.executeBatch();效率快。  回复  更多评论
  
# re: Spring+ibatis批量存储心得 2
2009-06-05 10:24 | wnick123
getSqlMapClientTemplate().execute(new SqlMapClientCallback(){
public Object doInSqlMapClient(SqlMapExecutor sqlExe) throws SQLException
{

getSqlMapClient().startBatch();
for(ChoiceItem ci:item.getChoiceItems()){
ci.setFormId(item.getFormId());
ci.setItemId(item.getItemId());
getSqlMapClientTemplate().insert("choice_item.insert",ci);
}
getSqlMapClient().executeBatch();
return null;
}
});
/*
getSqlMapClient().startBatch();
for(ChoiceItem ci:item.getChoiceItems()){
ci.setFormId(item.getFormId());
ci.setItemId(item.getItemId());
getSqlMapClientTemplate().insert("choice_item.insert",ci);
}
getSqlMapClient().executeBatch();
*/


请问这两种那个效率高?
为什么要使用回调的方法  回复  更多评论
  
# re: Spring+ibatis批量存储心得 2[未登录]
2009-09-02 13:58 | 小斌
mark  回复  更多评论
  
# re: Spring+ibatis批量存储心得 2[未登录]
2009-10-22 09:49 | allen
看看源码你就知道为什么容易溢出了,你写的方法也不是完全正确的,因为本身源码就存在bug,所以自己改源码中预处理ps生成语句算法,再像你这么用就可以,欢迎讨论qq279068158  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

framework

j2me

java

linux

web

其他

友情链接

素材

最新评论

阅读排行榜

评论排行榜