批处理插入到mybatis中的多个表

时间:2013-01-03 17:30:53

标签: oracle batch-file mybatis

当我通过引用mybatis映射器的DAO插入数据时,会影响多个表。

public void insertStuff(Collection<Stuff> data) {
   for (Stuff item : data) {
      mapper.insertT1(item.getT1Stuff());
      mapper.insertT2(item.getT2Stuff());
      Collection<MainStuff> mainData = item.getMainStuff();
      for (MainStuff mainItem : mainData) {
         mapper.insertMainData(mainItem);
      }
   }
}

我正在使用mybatis的BATCH执行器类型,但我很快就达到了Oracle的MAX_CURSOR限制,因为通过主循环在每次迭代中为三个映射器语句中的每一个创建了一个新的PreparedStatement(和一个新的Connection)。我可以通过在循环中多次迭代来避免这种情况:

public void insertStuff(Collection<Stuff> data) {
   for (Stuff item : data) {
      mapper.insertT1(item.getT1Stuff());
   }
   for (Stuff item : data) {
      mapper.insertT2(item.getT2Stuff());
   }
   for (Stuff item : data) {
      Collection<MainStuff> mainData = item.getMainStuff();
      for (MainStuff mainItem : mainData) {
         mapper.insertMainData(mainItem);
      }
   }
}

但是,后一种代码的可读性较差,性能成本较低,并且会破坏模块性。

有更好的方法吗?我是否需要直接使用SqlSession并在一定数量的队列排队后刷新语句?

1 个答案:

答案 0 :(得分:3)

如果你想使用批次,你应该使用第二种方式。在第一个代码中,您实际上没有任何批次。真实批次有N个相同的陈述。如果您执行了3个不同的查询并将它们封装成批处理,那么jdbc驱动程序将使用一个查询将它们分成3批。在第二个代码中,如果您有大量数据,将会有三个批次最快。