Java 为什么选择Spring数据JPA';s save()在单个记录上调用时比在记录列表上调用时慢?

Java 为什么选择Spring数据JPA';s save()在单个记录上调用时比在记录列表上调用时慢?,java,transactions,spring-data-jpa,spring-transactions,Java,Transactions,Spring Data Jpa,Spring Transactions,在单个记录上使用SimpleJpaRepository中的save功能与在记录列表上调用save相比,我的时间大大缩短了 下面的循环比列表花费的时间长10倍 for (Record r : csvRecords) { myRepository.save(r); } myRepository根本没有任何@Transactional注释。 但与上面的循环相比,下面的循环速度非常快 List<Record> myArray = new ArrayL

单个记录上使用
SimpleJpaRepository
中的
save
功能与在记录列表上调用save相比,我的时间大大缩短了

下面的循环比
列表花费的时间长10倍

    for (Record r : csvRecords) {
            myRepository.save(r);
    }
myRepository
根本没有任何
@Transactional
注释。 但与上面的循环相比,下面的循环速度非常快

List<Record> myArray = new ArrayList();
for (Record r : csvRecords) {
        myArray.add(r);
}
myRepository.save(myArray);
这个实现只是屏蔽了单个
save
操作,因此,如果我首先将数据存储在缓冲区中,或者对每个记录调用save,则不会有任何区别,因此速度的提高对我来说没有任何意义

编辑:
使用版本。

如果是单个分录,您将打开10个需要打开和关闭的交易;在
列表
的情况下,
save(singleEntry)
(在
saveAll
中使用)将重复使用已经打开的事务,因此它是一个打开和关闭的事务。顺便说一句,如果我正确地重新调用它的
saveAll(Iterable)
而不是
save(Iterable)

你确定你没有使用
simpleparepository
的子类,该子类会用更优化的方法覆盖
save(Iterable)
方法吗?如果对
save()
进行10次单次调用,则执行10次事务,但如果使用10条记录的列表调用
save()
,则只执行一次。这可能就是你观察的原因。JPAAPI没有这样的“保存”方法。也许你的意思是“Spring数据JPA”,它不是JPA API。@DN1谢谢你的评论。谢谢你指出它!显然我用的是旧版本。@Oleg啊!这是有道理的。
@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {

   List<S> result = new ArrayList<S>();

   if (entities == null) {
      return result;
   }

   for (S entity : entities) {
      result.add(save(entity));
   }

   return result;
}