`
zt843217
  • 浏览: 10545 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个iBatis框架进行batch处理的问题

阅读更多
http://blog.csdn.net/ecsoftcn/archive/2007/08/29/1763079.aspx

最近,同事的一个项目用Spring+iBatis做为数据持久层框架,MySql数据存储。项目发布不久就遇到了严重的性能问题,因此决定采用batch的方式提交数据。我以前的一篇文章:iBatis框架batch处理优化里详细的介绍了iBatis框架做batch处理的方式以及可能存在的问题和性能优化,因此同事参考这偏文章对项目进行了改造,引入了batch处理机制。但事情并不顺利,在只有2000条数据的情况下,做batch和不做batch所消耗的时间居然没有区别,平均都要50秒左右。而我在做测试的时候如果做 batch仅仅需要1秒,甚至更少的时间。真是见鬼了,难道是Spring在搞鬼?因为我的测试和同事的项目唯一的区别就是我是直接使用iBatis的 SqlMapClient,而同事的项目是使用Spring来获取SqlMapClient的实例。仔细检查了一下朋友的数据源配置,也没有发现什么问题。如下:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <bean id="sqlMapClient"
        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation" value="SqlMapConfig.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

        就在万般无奈的时候,突然想到一个问题:如果JDBC的AutoCommit属性被设置为true的话,那即便是按照batch的方式来写程序,也是徒劳的,每一条语句都会直接执行。于是抱着试试看的态度执行了下面的语句:
System.out.println("当前事物状态: " + sqlMapClient.getDataSource().getConnection().getAutoCommit());

果然不出所料,输出的值为:true,难怪batch不可用!问题找到了,如何解决呢?尝试在batch语句执行前手工设置autoCommit属性为false,如:sqlMapClient.getDataSource().getConnection().setAutoCommit(false);结果不好用,于是查看了一下org.apache.commons.dbcp.BasicDataSource的源代码,发现它的defaultAutoCommit属性默认值为true,这就难怪spring获取的SqlMapClient的autoCommit属性为true了,既然问题找到了, 解决起来就容易多了,只需要在上面的datasource配置中增加一行:<property name="defaultAutoCommit" value="false"/>就可以了。

        这里总结一下:iBatis默认的autoCommit属性为false,因此做batch处理的时候基本不会遇到什么问题;在Spring环境下,要看具体DataSource的配置。
分享到:
评论

相关推荐

    IBatis框架

    作为一个轻量级的框架,IBatis 提供了数据库操作的灵活性,使得开发者能够将 SQL 查询与 Java 代码直接结合,避免了传统的 ORM(对象关系映射)框架如 Hibernate 的复杂性。它允许开发者直接编写 SQL,从而更好地...

    ibatis乱码解决方法(ibatis独立)

    在IT行业中,数据库操作是必不可少的一部分,而Ibatis作为一款流行的Java持久层框架,它使得SQL与Java代码更好地结合,提供了灵活的数据库操作方式。然而,数据处理时遇到的编码问题,如乱码,常常会给开发者带来...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,提供了灵活的SQL映射机制,使得数据库操作更为简单高效。本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与...

    ibatis-2.3.

    iBATIS 是一个开源的 Java 库,它为 SQL 数据库提供了映射框架,允许将 SQL 查询与 Java 代码直接关联,从而简化了数据访问层(DAL)的开发工作。在 iBATIS 2.3 版本中,我们可能会关注以下几个关键知识点: 1. **...

    ibatis n+1选择问题 的几种解决方案

    在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...

    ibatis配置文件模板

    Ibatis,原名MyBatis,是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在Ibatis中,SQL是手写的,这使得开发者能够完全控制SQL的编写,避免了传统的对象关系映射工具所带来的性能损失。下面...

    ibatis api 英文文档

    本文档是iBATIS的英文API帮助文档,包含了iBATIS框架的所有核心组件和类的详细说明,对于理解和使用iBATIS进行数据库操作非常有帮助。 1. **SqlMapClient**:iBATIS的核心接口,提供了执行SQL映射文件中的SQL语句的...

    SpringBatch批处理 刘相编

    以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS消息队列中的数据进行读操作、处理和写操作,对于数据库的操作详细介绍了...

    ibatis2.X升级mybatis3.X之曲径通幽处

    首先,从版本号的升级可以察觉到一个明显的改变,Mybatis3.x引入了更现代化的设计理念。例如,Mybatis3.x的API更加简洁,对注解的支持也更为全面,这使得代码更易于理解和维护。在2.x版本中,XML配置文件是主要的...

    基于Spring+Ibatis的安全线程实现

    首先,Spring框架提供了丰富的功能,如依赖注入、AOP(面向切面编程)、事务管理等,而iBatis则是一个轻量级的SQL映射框架,它将SQL语句与Java代码分离,提高了代码的可读性和可维护性。结合两者,我们可以构建出松...

    ibatis批量存储

    在IT行业中,数据库操作是应用程序的核心部分,而Ibatis作为一款优秀的持久层框架,提供了灵活的数据访问接口。本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签...

    ibatis简单实例

    Ibatis,一个优秀的开源Java持久层框架,由Clinton Begin创建,最初名为iBATIS,后改为MyBatis。它简化了数据库与Java应用之间的数据交互,允许开发者将SQL语句直接写在配置文件中,避免了过多的JDBC代码,提升了...

    ibatis案例

    Ibatis,一个轻量级的Java持久层框架,是许多开发者在处理数据库操作时的首选工具。本案例旨在为初学者提供一个清晰的视角,帮助理解Ibatis的基本概念、配置和使用方法。以下是对Ibatis案例开发的一些核心知识点的...

    Ibatis增删改查

    Ibatis 最初由Clinton Begin 创建,后来成为Apache软件基金会的一个项目。它的核心理念是将数据访问层的逻辑与业务逻辑分离,通过XML或注解方式配置SQL语句,实现了SQL与Java对象的映射,简化了数据库操作。 ### 2....

    ibatis

    标题 "iBatis" 指的是一个开源的 Java 数据库持久层框架,它提供了 SQL 映射功能,使得开发者可以方便地将 SQL 查询与 Java 代码分离,从而实现更灵活的数据访问。这个框架最初由Clinton Begin 创建,并在 2005 年...

    iBatis操作

    本文将介绍如何利用iBatis框架进行批量添加、修改、删除等操作。 #### 二、iBatis批量操作原理 iBatis(现称为MyBatis)是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的JDBC...

    ibatis的批量插入DAO实例

    标题 "ibatis的批量插入DAO实例" 暗示了我们即将探讨的是关于Ibatis框架在数据库批量插入操作中的具体实现。Ibatis是一个优秀的持久层框架,它允许开发者将SQL语句与Java代码分离,提高了代码的可读性和可维护性。在...

    ibatis解决多对一n+1问题(更新上传例子(mybatis)代码)

    "ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...

    ibatis 批量 增删改查

    Ibatis,作为一个轻量级的Java持久层框架,它提供了灵活的方式来处理这些操作,使得开发者可以避免过于繁琐的手动SQL编写工作。本篇文章将深入探讨Ibatis如何实现批量增删改查,以及相关的最佳实践。 首先,批量...

Global site tag (gtag.js) - Google Analytics