iBatis框架做batch处理的问题

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

成都创新互联公司专业为企业提供蒲江县网站建设、蒲江县做网站、蒲江县网站设计、蒲江县网站制作等企业网站建设、网页设计与制作、蒲江县企业网站模板建站服务,十年蒲江县做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

  1.  
  2.         destroy-method="close"> 
  3.          
  4.          
  5.          
  6.          
  7.      
  8.     
  9.         class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
  10.          
  11.          
  12.      

 

就在万般无奈的时候,突然想到一个问题:如果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配置中增加一行:就可以了。

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

分享名称:iBatis框架做batch处理的问题
文章路径:http://www.mswzjz.cn/qtweb/news25/285425.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能