2013-02-20 4 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(); 
}