`
michael.softtech
  • 浏览: 208596 次
  • 性别: 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应对批量update

    #### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...

    mysql,jdbc详解,与ibatis对比。批量查询,分页处理。

    JDBC(Java Database Connectivity)是Java语言中用来对关系数据库进行访问的标准Java API。它提供了一种标准的方式来访问各种类型的数据库。 ##### 1. JDBC的基本操作流程 - **加载驱动**: 使用`Class.forName()`...

    ibatis批量处理

    ### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...

    ibatis的批量插入DAO实例

    通过以上步骤,我们就完成了Ibatis批量插入的DAO实例。在实际项目中,根据业务需求可能需要对SQL语句进行优化,如开启或关闭数据库的自动提交,或者调整批处理的大小以平衡性能和内存消耗。此外,Ibatis还支持使用`...

    ibatis批量存储

    本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签、批处理、foreach标签以及如何在Ibatis中使用HashMap。 1. Iterate标签详解及应用: Ibatis的iterate标签主要...

    ibatis 批量 增删改查

    在Ibatis中,批量操作提供了更高效、更灵活的方式处理大量数据。理解并熟练应用这些技巧,能显著提升应用程序的性能和可维护性。在实际项目中,根据具体需求选择合适的批量操作策略,并合理优化,可以大大降低系统...

    ibatis官方中文文档

    此外,文档还特别强调了如何通过iBATIS来调用存储过程,这是数据库操作中的一个重要特性,尤其是在处理复杂逻辑或批量操作时。 **iBATIS-SqlMaps-2-Tutorial_cn.pdf** 作为教程,这份文档提供了逐步指导,帮助读者...

    ibatis list

    ### iBatis批量操作:`&lt;iterate&gt;`标签的使用 `&lt;iterate&gt;`标签是iBatis中用于循环遍历集合的一种机制,它允许你在SQL语句中动态生成参数列表,这对于批量操作(如批量插入、更新或删除)尤为重要。该标签支持多种...

    iBatis操作

    ### iBatis批量操作 #### 一、简介 在企业级应用开发中,数据库操作是不可或缺的一部分。为了提高效率和减少资源消耗,批量处理成为了一种常用的技术手段。本文将介绍如何利用iBatis框架进行批量添加、修改、删除...

    Ibatis中文版教程

    除了基本的查询,iBatis还支持动态SQL、批量操作、分页等功能,这些都是在实际项目中非常实用的能力。例如,动态SQL允许开发者根据不同的条件构建SQL语句,而批量操作则可以提高数据处理的效率。 ### 四、总结 ...

    ibatis批量删除的方法.docx

    在使用iBatis进行数据操作时,批量删除是常见的需求之一。iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在配置文件中,提供了灵活的映射机制,使得Java对象与数据库之间的交互更加便捷。在iBatis中...

    IBatis.NET开发文档

    - 事务管理:讲解如何在iBATIS中进行事务控制,包括自动和手动提交、回滚等操作。 - 映射器接口:如何创建和使用Mapper接口,以及接口方法与XML映射文件的关联。 2. **iBATIS SQL Maps入门教程**: 入门教程通常...

    ibatis 中文手册

    Ibatis 的主要目标是简化 Java 应用中的数据访问,通过提供一种映射 SQL 语句到 Java 方法的方式,使开发人员可以更专注于业务逻辑而不是数据库操作。Ibatis 提倡“SQL 应该写在 XML 中”,这样可以避免 SQL 污染...

    ibatis api,ibatis文档,ibatis说明文档

    总之,Ibatis是一个强大且灵活的Java持久层框架,其API、文档和说明文档为开发者提供了全面的工具和指导,帮助他们高效地进行数据库操作。通过深入学习和实践,你可以利用Ibatis轻松地实现复杂的数据访问需求。

    ibatis批处理.doc

    在iBATIS中进行批处理主要有两种方式: 1. **Spring模式下的批处理** 在Spring框架中,iBATIS与Spring的事务管理相结合,可以方便地进行批处理操作。尽管Spring已经配置了事务管理,但在实际使用iBATIS批处理时,...

    ibatis结合oracle批量插入三种方法的测评

    iBatis是一种流行的持久层框架,提供了对数据库的访问和操作功能。Oracle是目前最流行的关系数据库管理系统之一。今天,我们将讨论iBatis结合Oracle批量插入三种方法的测评。 第一种方法:使用iterate标签 这种...

    ibatis日期格式.doc

    在处理日期时,iBatis允许我们使用`&lt;isNotEmpty&gt;`等标签进行条件判断,但这里提到的`DATE_FORMAT`函数是在SQL语句中进行格式化,这可能导致查询效率降低。如果数据库支持日期类型的直接比较,应当尽量避免这种格式化...

    ibatis 开发指南 2004

    13. **案例分析**:通过实际案例展示iBatis在不同场景下的应用,如CRUD操作、复杂查询、批量处理等。 14. **与其他框架集成**:探讨如何将iBatis与Spring、Hibernate等其他框架集成,构建更强大的企业级应用。 这...

Global site tag (gtag.js) - Google Analytics