복붙노트

[SPRING] 봄 데이터 시려면 성능 대 저장

SPRING

봄 데이터 시려면 성능 대 저장

나는 시려면이 봄 데이터 저장소에 저장보다 더 나은 성능을 가지고 이유를 이해하기 위해 노력하고있어. 나는 여기에서 볼 수 있습니다 CrudRepository을 사용하고 있습니다.

내가 만든 목록으로, 그냥 ID와 (I 문자열을 상수를 유지 벤치 ​​마크에 대한) 임의의 문자열이 10,000 개체를 추가 테스트합니다. 내 목록의 반복하고 각 요소에 .save 호출, 그것은 40 초 걸렸습니다. 이초 완료 같은 전체 목록 .saveAll 호출. 심지어 30K 요소 .saveAll 호출 4 초 걸렸습니다. 나는 각 테스트를 수행하기 전에 내 테이블을 절단해야했다. 심지어 50의 하위 목록이 30K 10 초 걸렸에 .saveAll 호출 일괄 처리.

전체 목록과 간단한 .saveAll 가장 빠른 것 같다.

나는 봄 데이터 소스 코드를 검색하려하지만 내가 가치있는 유일한 방법입니다. 여기 전체의 Iterable을 통해 .saveAll 단순히 반복을 보인다 내가하고있는 것처럼 호출은 각각에 .save. 그래서 어떻게 훨씬 빠르다? 내부적으로 어떤 트랜잭션 일괄 처리를하고 있습니까?

해결법

  1. ==============================

    1.코드를하지 않고, 내가 추측이, 나는 그것이 시려면의 경우 하나의 트랜잭션을 여는 대 저장의 경우 저장 각 개체에 대해 새로운 트랜잭션을 생성하는 오버 헤드과 관련이있다 생각합니다.

    코드를하지 않고, 내가 추측이, 나는 그것이 시려면의 경우 하나의 트랜잭션을 여는 대 저장의 경우 저장 각 개체에 대해 새로운 트랜잭션을 생성하는 오버 헤드과 관련이있다 생각합니다.

    그들은 모두 @Transactional 주석하는 저장하고 시려면의 정의를 알 수 있습니다. 프로젝트가 제대로 엔티티가 데이터베이스에 저장되고 있기 때문에 경우 것으로 보인다 구성되어있는 경우, 그 다음 방법 중 하나가 호출 될 때마다 트랜잭션이 생성된다는 것을 의미합니다. 새 트랜잭션이 저장 호출 할 때마다 생성되는 것을 의미 루프에서 save ()를 호출하기 만 시려면의 경우가 하나의 호출과 관계없이 개체의 수를 만들어 이에 대한 하나의 트랜잭션이 저장되는 경우.

    는 기본 트랜잭션 전파 Propagation.REQUIRED 때문에 모든 호출이 트랜잭션 내에서 실행됩니다 저장하는 트랜잭션 내에서 실행한다면 나는 경우 즉, 시험 자체가 트랜잭션 내에서 실행되지 않는 있으리라 믿고있어이 이미 통화를 열고 트랜잭션은 그 안에서 실행됩니다된다. 당신의 계획은 봄의 데이터를 사용하는 경우 난 강력하게 당신이 봄 트랜잭션 관리에 대해 읽어 것이 좋습니다.

  2. from https://stackoverflow.com/questions/49869277/spring-data-save-vs-saveall-performance by cc-by-sa and MIT license