1일1배움/JPA (김영한 님)

2023.12.21 [id 필드가 PK로써 SEQUENCE전략을 사용한다면 엔티티 매니저의 1차 캐시 기능은 사용불가?]

kim chan jin 2023. 12. 23. 21:30

그렇지 않다.

 

만약 id 필드가 PK로써 IDENTITY전략을 사용했다면 엔티티 매니저의 1차 캐시 기능은 사용 불가한 것이 맞다. 왜냐하면 DB에 INSERT 쿼리를 날린 이후에야 비로소 id값을 알아낼 수 있기 때문이다.

 

하지만 id 필드가 PK로써 SEQUENCE전략을 사용한다면 DB에 INSERT 쿼리를 날릴 필요까지는 없고

DB의 시퀀스에게 다음 id값을 물어봐서 가져온 이후에 엔티티 매니저의 1차 캐시에 저장(영속화)할 수 있다.

 

물론 쓰기 지연 SQL 저장소 기능도 사용할 수 있기 때문에 flush()가 호출될 때(flush() 직접 호출 || 트랜잭션 커밋 || JPQL 쿼리 실행) 한꺼번에 쿼리를 DB에 날린다.

 

추가로, 영속화할 때마다 DB의 시퀀스에게 다음 id값을 매번 물어보면 리소스 낭비이므로 allocateSize 속성을 50 으로 기본 설정되어있다.

가장 먼저 call next value for 시퀀스 이름 하여 시퀀스를 1로 맞춘다. 

만약 50개 미만의 데이터를 저장하는 상황이었다면 하이버네이트가 call next value for 시퀀스 이름 를 1번 호출하여 시퀀스를 51로 맞춘다. 즉, DB로부터 한번 시퀀스를 가져올 때 50을 메모리에 할당받고 id값이 51에 다다를때까지 1,2,3 ... 으로 증가하며 id값을 사용하고

만약 50개 초과의 데이터를 저장하는 상황이었다면 call next value for 시퀀스 이름 를 2번 호출하여 시퀀스를 101로 맞춘다. 즉, DB로부터 한번 시퀀스를 가져올 때 100을 메모리에 할당받아 id값이 101에 다다를때까지 1,2,3 ... 증가하는 식으로 id값을 사용한다.

이후에도 비슷한 로직이다.