论坛首页 入门技术论坛

spring+ibatis 批量提交数据提升性能

浏览 14475 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-27  
在系统中,提取数据循环计算后,每次需要有大概3000条左右的数据需要提交到数据库。以前在循环中单条插入,开始只有200条左右的数据,看不出性能上的问题,现在数据量增长了很多,所以需要对提交功能做一下优化。spring集成了ibatis的批量提交的功能,我们只要调用API就可以了
首先在你的dao中需要继承org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
然后在代码中调用getSqlMapClientTemplate方法, 覆写SqlMapClientCallback类中的doInSqlMapClient的方法
public void insertTreeCateBatch(final List<TreeCate> TreeCateList) throws DataAccessException{
    this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){
    public Object doInSqlMapClient(SqlMapExecutor executor)
            throws SQLException {
    executor.startBatch();
    int batch = 0;
    for(TreeCate TreeCate:TreeCateList){
    //调用获取sequence的方法。如果没有的话就去掉这行代码。
    TreeCate.setTreeCateId(getNextId());
//参数1为:ibatis中需要执行的语句的id
    executor.insert("TreeCate_insertTreeCate", TreeCate);
    batch++;
    //每500条批量提交一次。
    if(batch==500){
    executor.executeBatch();
    batch = 0;
    }
    }
    executor.executeBatch();
    return null;
    }
    });
}
批量插入减少了获取数据库连接池的次数,经过测试可以提高60%到70%的性能,大家不妨在项目中使用一下。
   发表时间:2009-02-28  
你的做法完全是正确的, 但是 “批量插入减少了获取数据库连接池的次数“, 这么说是误导别人的。性能的提高不是这个原因:
1。减少了499次网络交互的过程
2。数据库从500个事务, 变成了1个事务

你选择500也是一个非常合适的数据, 当然具体最多多少条数据提高最好的性能是要通过测试才能确定。 如果一次批量操作太多也是有问题的。 比如, 数据表部分缩太长时间,或者一次产生过大的redo log. 你可以继续深究一下哦。

这个才是真正的原因。
1 请登录后投票
   发表时间:2009-03-02  
每次提交的条数设置肯定不是越多越好,这个和oracle有联系,需要看实际情况,我们的服务器的配置是建议200条的。我设置500条是考虑到现网上服务器的情况。这方面具体性能的测试没能做到非常详细。
1 请登录后投票
论坛首页 入门技术版

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