如何在spring-data-jpa中快速保存entites的批量列表?

时间:2017-04-05 07:10:38

标签: java sql hibernate sqlite spring-data-jpa

我准备了List<BinValue> binValues变量中的新实体列表。

然后我想保存它。

我注意到,如果用

保存它们
for(BinValue binValue : binValues) {
    binValueRepo.save(binValue);
}

然后它的效果很慢。

如果用

保存
binValueRepo.save(binValues);

它尝试使用多个连接,但如果将连接限制为1,那么也会非常慢。

是否可以通过序列化

来加速保存
INSERT INTO MyTable (Field1, Field2) VALUES ('Value1','Value2'), ('ValueA', 'ValueB')...

有多个元组并在一批中运行?

更新

我写了这个

@Override
   @Transactional
   public void saveBulkNewEntities(Iterable<BinValue> binValues) {

      StringBuilder sb = new StringBuilder();

      sb.append("INSERT INTO bin_values (bin_id, region_id, value) VALUES ");

      boolean juststarted = true;
      for(BinValue binValue : binValues) {

         if( !juststarted ) {
            sb.append(", ");
         }
         else {
            juststarted = false;
         }

         sb.append("(");
         sb.append(binValue.getBin().getId());
         sb.append(", ");
         sb.append(binValue.getRegion().getId());
         sb.append(", ");
         sb.append(String.format(Locale.US, "%f", binValue.getValue()));
         sb.append(")");



      }

      Query query = em.createNativeQuery(sb.toString());
      em.joinTransaction();
      query.executeUpdate();

   }

并获得了巨大的速度!为什么!?

0 个答案:

没有答案