`

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

 
阅读更多

在使用org.springframework.jdbc.datasource.DriverManagerDataSource创建数据源时,你会发现

sqlMapClientTemplate.getDataSource().getConnection().getAutoCommit()的值是true,意思是说

你的事物会自动提交,如果当你和iBATIS结合使用时,那么iBATIS的BATCH是会失效的(可能描述的不准确)。

 

下面的一篇文章虽然是一片很老的文章了,但是查获找问题的思路还是值得借鉴!

 

说明,笔者使用DBCP测试时没有发现文章中提到的问题,难道是DBCP已做了修改!

不过此种问题还是值得记录!

 

 

转载:http://blog.csdn.net/ecsoftcn/article/details/1763079

 最近,同事的一个项目用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的配置。

分享到:
评论

相关推荐

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

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

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

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

    SpringBatch批处理 刘相编

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

    IBatis框架

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

    ibatis-2.3.

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

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

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

    spring2.0 中文教程

    7. **Spring Batch**:虽然Spring 2.0本身并不包含Spring Batch,但这是一个后续版本中引入的重要组件,用于处理批量和定时任务。Spring Batch提供了一套完整的解决方案,包括事务管理、错误处理和跟踪。 8. **国际...

    spring面试题.doc

    Spring 框架是Java开发中的一个核心组件,它是一个轻量级的容器,强调非侵入性设计,使得应用程序代码能与框架分离,降低了耦合度。Spring 的核心概念包括依赖注入(DI,Dependency Injection)和控制反转(IOC,...

    iBatis操作

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

    ibatis

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

    Spring教程

    Spring框架是一个广泛使用的Java企业级应用开发框架,它以其轻量级、非侵入式的设计理念赢得了开发者们的青睐。本教程旨在帮助读者全面理解和熟练掌握Spring框架的核心特性和应用。 ### Spring核心概念:IOC...

    ibatis的批量插入DAO实例

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

    Spring Framework 2.0开发参考手册(中文版chm)

    Spring作为一个轻量级、全面的企业级应用框架,为Java开发提供了强大的支持,尤其在依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)以及数据访问集成方面表现卓越。...

    spring in action 2.0

    6. **Spring Batch**:这是一个用于处理批量操作的模块,2.0版本加强了对复杂批处理任务的管理和监控。它支持事务管理、错误处理和重复数据处理,使得批量数据处理变得高效且可靠。 7. **portlet支持**:Spring 2.0...

    java~springboot~ibatis数组in查询的实现方法

    iBatis是一个基于Java的持久层框架,它提供了一个SQL映射器,可以将Java对象映射到关系数据库中。iBatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 现在,让我们看看如何使用iBatis实现数组in查询。在...

    Spring PPT文档

    Spring是一个由Rod Johnson创建的开源Java应用程序框架,主要针对J2EE(现在称为Java EE)设计和开发。它是一个轻量级容器,支持依赖注入(DI)和面向切面编程(AOP),旨在促进应用程序的组件化。Spring框架的核心...

    spring2.0技术手册.rar

    Spring Web模块主要涉及Spring MVC,这是一个强大的MVC框架,用于构建Web应用程序。它提供了模型-视图-控制器的设计模式,简化了HTTP请求的处理流程,同时支持多种视图技术,如JSP、Thymeleaf等。Spring MVC还与...

    ibatis对数据库进行增删改查操作的小例子

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写具体的数据操作上,而无需关注底层的JDBC代码。本小例子将帮助你理解并实践如何使用Ibatis进行数据库的增...

    Spring jar包

    8. **spring-webmvc.jar**:Spring MVC是Web层的具体实现,提供了一个强大的模型-视图-控制器架构,用于处理HTTP请求和响应。 9. **spring-jdbc.jar**:提供了数据库访问的抽象层,简化了JDBC的使用,包括数据源...

Global site tag (gtag.js) - Google Analytics