2010-05-27 18 views
4

我發現即使我有Spring事務包裝的代碼,並且它會在我期望的時候提交/回滾,爲了在使用Ibatis和Spring時使用JDBC批處理,我需要使用顯式的SqlMapClient事務方法。Ibatis startBatch()僅適用於SqlMapClient自己的啓動和提交事務,不適用於Spring管理的事務

I.e.這樣做配料如我期望:

dao.getSqlMapClient().startTransaction(); 
dao.getSqlMapClient().startBatch(); 

int i = 0; 
for (MyObject obj : allObjects) 
{ 
    dao.storeChange(obj); 

    i++; 
    if (i % DB_BATCH_SIZE == 0) 
    { 
     dao.getSqlMapClient().executeBatch(); 
     dao.getSqlMapClient().startBatch(); 
    } 
} 

dao.getSqlMapClient().executeBatch(); 
dao.getSqlMapClient().commitTransaction(); 

,但如果我沒有開閉事務語句,並依靠Spring來管理的事情(這是我想要做的!),配料只是不會發生。

鑑於Spring似乎正在處理交易管理交易的一面,任何人都可以在這裏提出任何已知問題的建議嗎?

(數據庫是MySQL的,我所知道的關於使用INSERT語句改寫它的JDBC僞分批進場的問題,這絕對不是這裏的問題)

回答

2

通過閱讀各種資源,發現這個一個背後的原因試驗和錯誤,我在這裏記錄了我們的結果,因爲它可能會幫助別人。

原來,不同的行爲是由於我們的DAO類擴展了Spring的SqlMapClientTemplate。在該類你有兩個「選擇」(我說的選擇;一個人的正確的,一個真的沒有):

  • 直接使用插入(),更新()等;使用完整的彈簧對象

  • getSqlMapClient()。insert(),update()等;這一實際工作使用com.ibatis ...對象由getSqlMapClient(返回),而不是一個春天

兩個一般工作,但是從我讀的第一選擇是好,例如如果你使用Spring,你希望完全基於Spring,而不是「跳出」到Ibatis對象。

現在,SqlMapClientTemplate不直接提供對startBatch()/ executeBatch()的訪問,只是方便的insert(),update()等東西,所以像這樣的代碼對於做這種事情是必需的。下面的代碼完全適用於我們的Spring託管事務,而不是顯式代碼startTransaction()。

(免責聲明可能包含錯誤,由於我的清晰度 「匿名的」 工作代碼)

public class MyFunkyDao extends SqlMapClientDaoSupport 
{ 
    private static final int DB_BATCH_SIZE = 1000; 

    public void storeMyData(final List<MyData> listData) 
    { 
     getSqlMapClientTemplate().execute(new SqlMapClientCallback() 
     { 
      @Override 
      public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException 
      { 
       int count = 0, total = 0; 

       Map<String, Object> params = new HashMap<String, Object>(); 

       executor.startBatch(); 

       for (MyData data: listData) 
       { 
        params.put("param name 1", data.getValue()); 

        executor.insert("insertData", params); 

        count++; 
        if (count % DB_BATCH_SIZE == 0) 
        { 
         total += executor.executeBatch(); 
         executor.startBatch(); 
        } 

        params.clear(); 
       } 

       total += executor.executeBatch(); 

       return new Integer(total); 
      } 
     }); 
    } 
} 

鏈接:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/ibatis/SqlMapClientTemplate.html

0

的原因是。如果你不打開一個交易。在調用插入語句後,iBatis將提交事務。 欲瞭解更多信息,你可以檢查代碼在com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate

相關問題