程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> iBatis框架做batch處理的問題

iBatis框架做batch處理的問題

編輯:關於JAVA

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved