2013-02-20 69 views
0

mybatis中的批處理語句超時。我想通過定期清除語句來限制我發送到數據庫的負載。在iBATIS的,我用了一個回調,這樣的事情:mybatis批處理執行期間的週期性沖洗

 sqlMapClientTemplate.execute(new SqlMapClientCallback<Integer>() { 
      @Override 
      public Integer doInSqlMapClient(SqlMapExecutor executor) 
        throws SQLException { 
       executor.startBatch(); 
       int tally = 0; 
       for (Foo foo: foos) { 
         executor.insert("FooSql.insertFoo",foo.getData()); 
         /* executes batch when > MAX_TALLY */ 
        tally = BatchHelper.updateTallyOnMod(executor, tally); 
       } 
       return executor.executeBatch(); 
      } 
     }); 

有沒有更好的方式MyBatis的做到這一點?或者我需要用SqlSessionCallback做同樣的事情嗎?這感覺很麻煩。我真正想要做的就是配置項目以刷新每個N分批語句。

回答

1

我沒有得到任何答覆,所以我會分享我解決的解決方案。

Mybatis提供了對語句刷新的直接訪問。我自動裝配了SqlSession,使用Guava將集合分割成可管理的塊,然後在每個塊之後刷新語句。

Iterable<List<Foo>> partitions = Iterables.partition(foos, MAX_TALLY); 
for (List<Foo> partition : partitions) { 
    for (Foo foo : partition) { 
     mapper.insertFoo(foo); 
    } 
    sqlSession.flushStatements(); 
}