iBatis框架做batch处理的问题

最近,同事的一个项目用Spring+iBatis做为数据持久层框架,MySql数据存储。项目发布不久就遇到了严重的性能问题,因此决定采用batch的方式提交数据。我以前的一篇文章:里详细的介绍了iBatis框架做batch处理的方式以及可能存在的问题和性能优化,因此同事参考这偏文章对项目进行了改造,引入了batch处理机制。但事情并不顺利,在只有2000条数据的情况下,用iBatis框架做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,因此用iBatis框架做batch处理的时候基本不会遇到什么问题;在Spring环境下,要看具体DataSource的配置。

时间: 2024-09-20 21:16:19

iBatis框架做batch处理的问题的相关文章

深入分析 iBATIS 框架之系统架构与映射原理

iBATIS 框架主要的类层次结构 总体来说 iBATIS 的系统结构还是比较简单的,它主要完成两件事情: 根据 JDBC 规范建立与数据库的连接: 通过反射打通 Java 对象与数据库参数交互之间相互转化关系. iBATIS 的框架结构也是按照这种思想来组织类层次结构的,其实它是一种典型的交互式框架.先期准备好交互的必要条件,然后构建一个交互的环境,交互环境中还划分成会话,每次的会话也有一个环境.当这些环境都准备好了以后,剩下的就是交换数据了.其实涉及到网络通信,一般都会是类似的处理方式. 图

源码-用javaSSH框架做一个简单的登录功能

问题描述 用javaSSH框架做一个简单的登录功能 用SSH框架做一个简单的登录功能,登录成功则跳转到一个页面,登录失败则跳转到一个失败页面,MySQL数据库.求大神指点,最好能提供源码 解决方案 Spring 3.x 企业应用开发实战的第一个例子就符合你的要求了.Mysql+srping3 解决方案二: 告诉我你的扣扣邮箱,我发你邮箱 解决方案三: 主要还是在struts2 里面,处理业务逻辑,再跳转到指定页面,关键在struts,xml配置文件里面

在SCA Module中使用iBATIS框架实现数据持久层

在完成 SCA Module 建模后用 Java 对象进行实现时,采用 Hibernate 和采用 iBATIS 实现 SCA Module 的数据持久层,目的都是为 SDO 提供数据访问服务并加快 SCA 模块实现.前文已经讲过关于如何使用 Hibernate 实现 SCA Module 的数据持久层,本文将介绍 iBATIS 框架,比较 iBATIS 和 Hibernate 的异同,并以实例的方式介绍如何使用 iBATIS 实现 SCA Module 的数据持久层. iBATIS 是一种数据

html5框架-用框架做完一个网页之后,如何使整个页面滚动起来

问题描述 用框架做完一个网页之后,如何使整个页面滚动起来 用框架做完一个网页之后,如何使整个页面滚动起来用框架做完一个网页之后,如何使整个页面滚动起来 解决方案 是iframe加载的页面滚动吧?还是放置iframe的父页滚动?说得不明不白,如果是frameset只能滚动加载页面,父页滚动不了 解决方案二: 你用的是什么html5框架?把你的代码贴出来.

java-刚学ssh框架做了一个项目 jsp页面无法获取action的值,求教啊。。。以下是代码

问题描述 刚学ssh框架做了一个项目 jsp页面无法获取action的值,求教啊...以下是代码 页面都正常跳转 就是取不到值 用的是iframe框架 main.jsp可以获取,不过main.jsp指向的top.jsp页面无法获取值 Action部分代码 private static final long serialVersionUID = 1L; private UserService userService; private User user; public String login()

ionic的框架做的网页链接在微信里打开慢了好几秒是什么问题? 求解答

问题描述 ionic的框架做的网页链接在微信里打开慢了好几秒是什么问题? 求解答 本人在做移动web端性能优化,这个网页是ionic框架做成的,有使用ionic做的网页在微信上打开慢的朋友吗,为什么在浏览器打开都不会慢,还是要换框架 解决方案 http://www.zhihu.com/question/26445216

springmvc-用springMVC框架做文件上传时遇到问题

问题描述 用springMVC框架做文件上传时遇到问题 我是基于red5服务器.来用springMVC框架做文件上传.在上传文件时遇到错误. @RequestMapping(value = "/upload.do",method = RequestMethod.POST) public String upload(HttpServletRequest request, HttpServletResponse response, String string) { System.out.p

udp_reactor框架做服务器每秒最多可以接收多少个包?

问题描述 udp_reactor框架做服务器每秒最多可以接收多少个包? 请求各们大神提点一下,小弟现在做压力测试最大能接收到10000个包! 解决方案 和硬件.网络都有关系的,以测试为准 解决方案二: 每个包1k byte

语言 java-跪求jfinal框架做的三级下拉框联动的demo 和数据库连接的

问题描述 跪求jfinal框架做的三级下拉框联动的demo 和数据库连接的 语言:java 数据库:sql 框架:jfinal 实现三级下拉框联动 求jfinal 大神 跪求了