`
michael.softtech
  • 浏览: 207023 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Ibatis中进行批量操作

阅读更多

 

     最近遇到这样一个客户需求:需要向数据库里面一次插入几万条数据。系统的Persistence层用的是ibatis,

事务是通过spring管理。之前都是少量数据的操作,所以都是按照以下方式插入的:

    

    

class Service extends SqlMapClientDaoSupport
{
 public void insert(...)
{
  getSqlMapClientTemplate().insert(..);
  
}

}

  

   但是数据量大时,速度奇慢。于是找时间读了一下ibatis的源码,终于发现了问题所在,记录如下:

 

   首先,过跟踪代码,发现sql的相关操作都有这样一个入口:

  

 public Object execute(SqlMapClientCallback action){ action.doInSqlMapClient(session);....}

   

      上面的session是SqlMapSession的一个实例,而SqlMapSession继承了SqlMapExecutor接口,实际上以上的代码最终还是通过SqlMapExecutor的对应方法来实现(比如:session.insert(..)).

      于是继续追踪SqlMapSession的实现类:SqlMapSessionImpl。发现这个类的所有JDBC操作都是通过代理类SqlMapExecutorDelegate来实现的(这个代理类比SqlExecutor多了事务管理的配置:有一个TransactionManager)。这个代理类在每个单独的操作时,都先有这样一条语句:

 

  

 trans = getTransaction(session);
 autoStart = trans == null;
trans = autoStartTransaction(session, autoStart, trans);

 

    上述代码通过判断sutoStart来决定是不是开启一个事务。而autoStart是通过判断当前是不是已经有打开的事务

     来赋值的。那么就可以理解了:如果当前操作没有在事务下面,那么自动开启(取出)一个事务;如果已经有了事务,那么  直接使用当前事务。如果要进行批量操作,那么就必须在调用之前开启一个事务。所以就简单了:

    

public Object operate(final List<CardInfo> cardsToAdd, final List<AcctInfo> acctsToAdd, final List<AcctInfo> acctsToUpdate) throws DataAccessException{
     
  Object obj=this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){
     public Object doInSqlMapClient(SqlMapExecutor executor)
             {
     
     try{
     getSqlMapClient().startTransaction();
     executor.startBatch();...

   后面的startBatch语句是通过使用jdbc的批处理来提高效率。这样就能顺利执行同一个事务下的批量操作了(注意:如果在批量startBatch之前没有开启事务,批处理是无效的)。

 

   就总结到这里吧,请光临的朋友多多指教。

  

    

  

 

  

分享到:
评论

相关推荐

    ibatis批量处理

    ibatis批量处理操作实现,以及sping中需要注意点

    ibatis批处理

    ibatis批量操作存在两种方式: 一种是直接在代码中进行循环操作,另一种是在配置文件中进行循环操作。

    iBatis操作

    iBatis批量添加、修改、删除

    iBATIS实战

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...

    IBATIS实用记录

    3.3.3 在指定对象中存放查询结果(select) 7 3.3.4 执行批量查询 (select) 7 3.3.5 关于AutoCommit 7 3.3.6 查询指定范围内的数据 7 3.3.7 结合RowHandler进行查询(select) 7 3.3.8 分页查询 (select) 7 3.3.9 基于...

    xorm:xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常正确。本库是基于原版xorm的定制增强版本,为xorm提供类似ibatis的配置文件及动态SQL支持,支持AcitveRecord操作

    Sql,Cols等函数和结构体等方式作为条件支持级联加载结构支持类ibatis方式配置SQL语句(支持XML配置文件,json配置文件,xsql配置文件,支持 , , 模板和自定义实现配置多种方式)支持动态SQL功能支持一次批量混合

    Spring中文帮助文档

    11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert...

    java的轻量级orm工具包jdao.zip

     如果你觉得hibernate,ibatis等orm框架过于笨重,不烦试下jdao,它可以在团队开发中规范团队持久层代码,较少开发量,特别在单表操作上基本是对象操作,对于复杂SQL查询也有较好的封装。一、使用DAO方式操作数据:...

    Spring API

    11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题56.ibatis和hibernate有什么不同 Java面试题57.hibernate对象状态及其转换 Java面试题58:hibernate的缓存 Java面试题59.webservice的使用场景 Java面试题60.activiti的简单介绍 Java面试题61.linux的使用...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    操作系统 linux 代码控制 自动化代码检查 sonar 代码规范 阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java面试题84:项目流程和业务注意事项.mp4 │ 面试必问-Mysql索引背后的故事 │ ├─java面试专属 │ ├─1....

Global site tag (gtag.js) - Google Analytics