iBatis框架做batch处理的问题

开发 后端
iBatis默认的autoCommit属性为false,因此用iBatis框架做batch处理的时候基本不会遇到什么问题;在Spring环境下,要看具体DataSource的配置。

最近,同事的一个项目用Spring+iBatis做为数据持久层框架,MySql数据存储。项目发布不久就遇到了严重的性能问题,因此决定采用batch的方式提交数据。我以前的一篇文章:里详细的介绍了iBatis框架做batch处理的方式以及可能存在的问题和性能优化,因此同事参考这偏文章对项目进行了改造,引入了batch处理机制。但事情并不顺利,在只有2000条数据的情况下,用iBatis框架做batch处理和不做batch所消耗的时间居然没有区别,平均都要50秒左右。而我在做测试的时候如果做batch仅仅需要1秒,甚至更少的时间。真是见鬼了,难道是Spring在搞鬼?因为我的测试和同事的项目唯一的区别就是我是直接使用iBatis的SqlMapClient,而同事的项目是使用Spring来获取SqlMapClient的实例。仔细检查了一下朋友的数据源配置,也没有发现什么问题。如下:

 

  1.  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"   
  2.         destroy-method="close"> 
  3.         <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
  4.         <property name="url" value="jdbc:mysql://localhost/test"/> 
  5.         <property name="username" value="root"/> 
  6.         <property name="password" value="root"/> 
  7.     </bean> 
  8.     <bean id="sqlMapClient"   
  9.         class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
  10.         <property name="configLocation" value="SqlMapConfig.xml"/> 
  11.         <property name="dataSource" ref="dataSource"/> 
  12.     </bean> 

 

就在万般无奈的时候,突然想到一个问题:如果JDBC的AutoCommit属性被设置为true的话,那即便是按照batch的方式来写程序,也是徒劳的,每一条语句都会直接执行。于是抱着试试看的态度执行了下面的语句:

  1. 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的配置。

【编辑推荐】

  1. iBATIS框架做batch处理优化浅析
  2. iBATIS with MapBean应用浅析
  3. 分析ibatis dao框架
  4. ibatis resultMap groupBy属性巧使用
  5. ibatis resultMap报错解决一例
责任编辑:佚名 来源: DIY部落
相关推荐

2009-07-22 16:43:22

iBATIS框架iBATIS优化

2022-08-02 20:47:38

Spring框架应用程序

2009-07-16 17:01:32

ibatis dao

2009-07-16 09:14:26

iBATIS DAO

2023-08-22 08:01:42

SpringBatch事务管理

2020-11-03 15:10:55

Spring Batc框架Java

2009-07-20 13:22:47

iBATIS.Net日

2009-07-15 17:41:55

iBATIS事务处理

2009-07-15 09:30:00

ibatis级联

2017-01-12 14:50:15

大数据Spring Batc框架

2020-12-11 11:26:47

Spring批处理重试

2009-07-21 16:17:28

iBATIS.NET

2009-08-20 10:11:50

Java持久层框架iBATIS 3

2020-11-02 18:38:17

Batch Norma深度学习

2009-07-20 15:14:44

iBATIS.NET连

2009-07-15 11:26:25

ibatis插件

2009-07-16 09:46:20

iBATIS Log机

2009-09-24 14:04:25

Hibernate i

2009-07-17 10:59:59

iBATIS接口

2011-03-15 13:30:27

IBatis.netMySQL
点赞
收藏

51CTO技术栈公众号