新聞中心
最近,同事的一個(gè)項(xiàng)目用Spring+iBatis做為數(shù)據(jù)持久層框架,MySql數(shù)據(jù)存儲(chǔ)。項(xiàng)目發(fā)布不久就遇到了嚴(yán)重的性能問題,因此決定采用batch的方式提交數(shù)據(jù)。我以前的一篇文章:里詳細(xì)的介紹了iBatis框架做batch處理的方式以及可能存在的問題和性能優(yōu)化,因此同事參考這偏文章對(duì)項(xiàng)目進(jìn)行了改造,引入了batch處理機(jī)制。但事情并不順利,在只有2000條數(shù)據(jù)的情況下,用iBatis框架做batch處理和不做batch所消耗的時(shí)間居然沒有區(qū)別,平均都要50秒左右。而我在做測試的時(shí)候如果做batch僅僅需要1秒,甚至更少的時(shí)間。真是見鬼了,難道是Spring在搞鬼?因?yàn)槲业臏y試和同事的項(xiàng)目唯一的區(qū)別就是我是直接使用iBatis的SqlMapClient,而同事的項(xiàng)目是使用Spring來獲取SqlMapClient的實(shí)例。仔細(xì)檢查了一下朋友的數(shù)據(jù)源配置,也沒有發(fā)現(xiàn)什么問題。如下:

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供蒲江縣網(wǎng)站建設(shè)、蒲江縣做網(wǎng)站、蒲江縣網(wǎng)站設(shè)計(jì)、蒲江縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、蒲江縣企業(yè)網(wǎng)站模板建站服務(wù),十年蒲江縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
-
- destroy-method="close">
-
- class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
就在萬般無奈的時(shí)候,突然想到一個(gè)問題:如果JDBC的AutoCommit屬性被設(shè)置為true的話,那即便是按照batch的方式來寫程序,也是徒勞的,每一條語句都會(huì)直接執(zhí)行。于是抱著試試看的態(tài)度執(zhí)行了下面的語句:
- System.out.println("當(dāng)前事物狀態(tài): " + sqlMapClient.getDataSource().getConnection().getAutoCommit());
果然不出所料,輸出的值為:true,難怪batch不可用!問題找到了,如何解決呢?嘗試在batch語句執(zhí)行前手工設(shè)置autoCommit屬性為false,如:sqlMapClient.getDataSource().getConnection().setAutoCommit(false);結(jié)果不好用,于是查看了一下org.apache.commons.dbcp.BasicDataSource的源代碼,發(fā)現(xiàn)它的defaultAutoCommit屬性默認(rèn)值為true,這就難怪spring獲取的SqlMapClient的autoCommit屬性為true了,既然問題找到了, 解決起來就容易多了,只需要在上面的datasource配置中增加一行:
這里總結(jié)一下:iBatis默認(rèn)的autoCommit屬性為false,因此用iBatis框架做batch處理的時(shí)候基本不會(huì)遇到什么問題;在Spring環(huán)境下,要看具體DataSource的配置。
文章題目:iBatis框架做batch處理的問題
標(biāo)題URL:http://www.fisionsoft.com.cn/article/coehgio.html


咨詢
建站咨詢
