2017-11-24 43 views
3

save 기능을 SimpleJpaRepositorysingle record vs calling save on a list of records에 사용하면 시간이 크게 감소합니다.스프링 데이터 JPA의 save()가 단일 레코드에서 호출 될 때 속도가 느린 이유와 레코드 목록에서 호출 할 때 속도가 느린 이유는 무엇입니까?

아래의 루프는 list보다 길며 입니다.

for (Record r : csvRecords) { 
      myRepository.save(r); 
    } 

myRepository는 전혀 @Transactional 주석이 없습니다. 그러나 아래의 루프는 위와 비교하여 놀랍도록 빠릅니다.

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

우리는 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; 
} 

에서 save 구현에 불과 마스크 내가 먼저 버퍼 또는 I 내 데이터를 저장하는 경우는 어떤 차이가해서는 안 단일 save 동작이 구현을 보면 내 기록의 각각에 대한 호출을 저장하십시오. 따라서 속도 증가는 저에게 의미가 없습니다.

편집 : docs.spring.io/autorepo/docs/spring-data-commons/1.5.1.RELEA‌​SE/ 버전을 사용합니다.

+0

'SimpleJpaRepository'의 서브 클래스를 사용하지 않고,'save (Iterable)'메소드를 오버라이드 한 것이 더 최적화되어 있습니까? –

+1

'save()'에 대한 10 번의 단일 호출의 경우 10 개의 트랜잭션을 수행하고 있지만'save()'를 호출하면 10 개의 레코드 목록 만 포함됩니다. 그것은 아마도 당신의 관찰을위한 이유 일 것입니다. – blafasel

+1

JPA API에는 이러한 "저장"메소드가 없습니다. 아마 당신은 JPA API가 아닌 "Spring Data JPA"를 의미 할 것입니다. – DN1

답변

3

단일 항목의 경우 열거 나 닫아야하는 10 개의 거래를 여는 중입니다. List의 경우 save(singleEntry) (즉 saveAll 내부에서 사용됨)은 이미 열려있는 트랜잭션을 다시 사용하므로 열리고 닫힌 하나의 트랜잭션입니다. 그리고 내가 올바르게 다시 부르면 btw saveAll(Iterable)이 아니라save(Iterable)가 아니라.

+0

그것을 지적 해 주셔서 감사합니다! 분명히 이전 버전을 사용했습니다. – Oleg

+0

@Oleg 아! 그건 의미가 있습니다. – Eugene