为什么 Spring Data JPA 的 save() 在单个记录上调用与在记录列表上调用它时很慢?

Ole*_*leg 5 java transactions spring-transactions spring-data-jpa

我使用时遇到的主要时间减少save,从功能SimpleJpaRepositorysingle record vs calling save on a list of records

下面的循环10list.

    for (Record r : csvRecords) {
            myRepository.save(r);
    }
Run Code Online (Sandbox Code Playgroud)

myRepository根本没有任何@Transactional注释。但是与上面的循环相比,下面的循环速度非常快。

List<Record> myArray = new ArrayList();
for (Record r : csvRecords) {
        myArray.add(r);
}
myRepository.save(myArray);
Run Code Online (Sandbox Code Playgroud)

如果我们看一下save实现SimpleJpaRepository

@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;
}
Run Code Online (Sandbox Code Playgroud)

这个实现只是屏蔽了单个save操作,所以如果我首先将数据存储在缓冲区中或者我对每个记录调用 save ,那么它应该没有任何区别,因此速度增加对我没有任何意义。

编辑:使用docs.spring.io/autorepo/docs/spring-data-commons/1.5.1.RELEA??SE/ version 。

Eug*_*ene 4

对于单个条目,您将打开 10 笔交易 - 需要打开和关闭;List在这种情况下save(singleEntry)(在内部使用saveAll)将重新使用已经打开的事务,因此它是一个打开和关闭的事务。顺便说一句,如果我正确地重新调用它saveAll(Iterable) 不是 save(Iterable)