해결된 질문
작성
·
803
8
안녕하세요. 강의 열심히 듣고 있는 주니어 개발자입니다.
강의 내용 똑같이 수행했으나 시퀀스 값이 다른 점이 있어 문의드립니다.
(33:05) 부분에서 시퀀스 전략 속성값 initialValue=1, allocationSize=50
으로 설정했을시 persist 이전에 초기값이 -49라고 나오지만 제 환경에서는 초기값이 1로 나옵니다.
H2 DB 2.1.214, Hibernate 5.6.10을 사용중인데 혹시 버전이 달라서 그런걸까요?
로그에는 시퀀스에 대한 call next value를 호출하지 않으며 제 생각에도 initialValue=1
로 명시되어 있기 때문에 초기값이 1인게 정상인 것 같은데 제가 놓치는 부분이 있는지 문의드립니다.
위 질문의 연장선으로 persist 1번 수행시 call next value 수행 결과는 아래와 같은데요.
DB 시퀀스 자체의 increment값이 50이어서 51이 되는것은 이해하였습니다.
JPA에서 51번째 데이터까지는 DB 시퀀스를 참조하지 않고 메모리에서 꺼내와야하는데 persist로 객체를 2번 저장시 아래와 같이 call next value가 2번 호출이 되고 시퀀스 값은 101이 됩니다.
(33:43) 여기서 2번 호출 되는 이유가 JPA 애플리케이션에서 사용하는 allocationSize가 50이기 때문에 추후 자신이 사용할 메모리 시퀀스값을 선점하기 위해서라고 이해했는데요. (DB에는 51로 증가시켜놓고, 2부터 51까지 사용하기 위함)
이렇게 되면 제 경우에는 2를 사용하기 위해서 시퀀스 값을 101로 올려놓는 이상한 동작을 하는 것인데 이해가 가지 않습니다.
또한 위와 같이 52번째 객체 저장시 call next value가 한번 더 수행되어 시퀀스 값은 151이 됩니다.
의도한대로 작동은 하지만 시퀀스가 한단계씩 밀려서 작동한다는 것이 이해가 가지 않습니다.
감사합니다. 질문할 시간에 직접 해보는게 나았겠네요 ㅜ
단순한 버전 차이인 것 같아요.
버전 맞춰서 해보니까 동일하게 나옵니다. ㅎㅎ
H2 1.4.200 버전까지는 초기값이 -49로 설정되고
참고) CURRENT_VALUE
H2 2.0.202 버전부터는 초기값이 1로 설정되네요.
참고) BASE_VALUE
관련 수정사항
https://github.com/h2database/h2database/commit/85225545497538e9a7d86075cd342fa98cf33205
추가)
call next value 쿼리와 실행값이 동일하게 보이는 것으로 보아 실제 시퀀스값이 변경된 것이 아니라
h2 2.x 버전부터 웹콘솔에서 표시해주는 값이 변경된 것 같습니다.
작동 원리는 강의 내용과 동일합니다!