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 提供了数据库操作的灵活性,使得开发者能够将 SQL 查询与 Java 代码直接结合,避免了传统的 ORM(对象关系映射)框架如 Hibernate 的复杂性。它允许开发者直接编写 SQL,从而更好地...
在IT行业中,数据库操作是必不可少的一部分,而Ibatis作为一款流行的Java持久层框架,它使得SQL与Java代码更好地结合,提供了灵活的数据库操作方式。然而,数据处理时遇到的编码问题,如乱码,常常会给开发者带来...
在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,提供了灵活的SQL映射机制,使得数据库操作更为简单高效。本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与...
iBATIS 是一个开源的 Java 库,它为 SQL 数据库提供了映射框架,允许将 SQL 查询与 Java 代码直接关联,从而简化了数据访问层(DAL)的开发工作。在 iBATIS 2.3 版本中,我们可能会关注以下几个关键知识点: 1. **...
在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...
Ibatis,原名MyBatis,是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在Ibatis中,SQL是手写的,这使得开发者能够完全控制SQL的编写,避免了传统的对象关系映射工具所带来的性能损失。下面...
本文档是iBATIS的英文API帮助文档,包含了iBATIS框架的所有核心组件和类的详细说明,对于理解和使用iBATIS进行数据库操作非常有帮助。 1. **SqlMapClient**:iBATIS的核心接口,提供了执行SQL映射文件中的SQL语句的...
以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS消息队列中的数据进行读操作、处理和写操作,对于数据库的操作详细介绍了...
首先,从版本号的升级可以察觉到一个明显的改变,Mybatis3.x引入了更现代化的设计理念。例如,Mybatis3.x的API更加简洁,对注解的支持也更为全面,这使得代码更易于理解和维护。在2.x版本中,XML配置文件是主要的...
首先,Spring框架提供了丰富的功能,如依赖注入、AOP(面向切面编程)、事务管理等,而iBatis则是一个轻量级的SQL映射框架,它将SQL语句与Java代码分离,提高了代码的可读性和可维护性。结合两者,我们可以构建出松...
在IT行业中,数据库操作是应用程序的核心部分,而Ibatis作为一款优秀的持久层框架,提供了灵活的数据访问接口。本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签...
Ibatis,一个优秀的开源Java持久层框架,由Clinton Begin创建,最初名为iBATIS,后改为MyBatis。它简化了数据库与Java应用之间的数据交互,允许开发者将SQL语句直接写在配置文件中,避免了过多的JDBC代码,提升了...
Ibatis,一个轻量级的Java持久层框架,是许多开发者在处理数据库操作时的首选工具。本案例旨在为初学者提供一个清晰的视角,帮助理解Ibatis的基本概念、配置和使用方法。以下是对Ibatis案例开发的一些核心知识点的...
Ibatis 最初由Clinton Begin 创建,后来成为Apache软件基金会的一个项目。它的核心理念是将数据访问层的逻辑与业务逻辑分离,通过XML或注解方式配置SQL语句,实现了SQL与Java对象的映射,简化了数据库操作。 ### 2....
标题 "iBatis" 指的是一个开源的 Java 数据库持久层框架,它提供了 SQL 映射功能,使得开发者可以方便地将 SQL 查询与 Java 代码分离,从而实现更灵活的数据访问。这个框架最初由Clinton Begin 创建,并在 2005 年...
本文将介绍如何利用iBatis框架进行批量添加、修改、删除等操作。 #### 二、iBatis批量操作原理 iBatis(现称为MyBatis)是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的JDBC...
标题 "ibatis的批量插入DAO实例" 暗示了我们即将探讨的是关于Ibatis框架在数据库批量插入操作中的具体实现。Ibatis是一个优秀的持久层框架,它允许开发者将SQL语句与Java代码分离,提高了代码的可读性和可维护性。在...
"ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...
Ibatis,作为一个轻量级的Java持久层框架,它提供了灵活的方式来处理这些操作,使得开发者可以避免过于繁琐的手动SQL编写工作。本篇文章将深入探讨Ibatis如何实现批量增删改查,以及相关的最佳实践。 首先,批量...