작성
·
228
1
1. 처음 em.persist()를 할떄 allocation했던거 만큼의 시퀀스 값을 미리 가져와서 메모리에 값을 저장해놓는다. 이떄 1부터 50의 값이 메모리에 저장된다.
2. db에 시퀀스의 값(현재값)은 50까지 줬으니 51로 되어있다.
3. 이후 em.persist()를 하면 메모리에 있는 값이 사용되고, 만약 50까지 다 사용하고 나서 em.persist()를하게 되면 51부터 다시 allocation했던거 만큼의 시퀀스 값을 미리 가져와서 메모리에 값을 저장해놓는다. 이때 51부터 100의 값이 메모리에 저장된다. db에 시퀀스의 값(현재값)은 100까지 줬으니 101로 되어있다.
이러한 동작 과정으로 이해를 했는데요. 이렇게 이해하는게 맞을까요?
+ 근데 그럼 여쭤보고 싶은게
em.persist()를 한번만 할 경우, call next value for MEMBER_SEQ5를 한번만 호출하고
이런식으로 되어있지만, em.persist()를 2번 이상으로 하게되면, call next value for MEMBER_SEQ5를 두번 호출하고
이런식으로 되더라구요... 그 이유를 도무지 모르겠습니다..
답변 4
0
메모리에 저장된 시퀀스 값들이 소모되고, 추가적으로 다음 세트를 가져와야 하는 상황 모두 아닌데도 불구하고 왜 call next value for MEMBER_SEQ 를 두번 호출하나요??
https://read-write-developer.tistory.com/m/143 해당 블로그를 참고헀는데도 이해가 잘 안됩니다ㅜㅜ
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.
allocationSize와 관련된 JPA의 시퀀스 전략에 대해 궁금하신 점이 있군요. JPA에서 시퀀스를 사용하면서 allocationSize를 설정할 때 내부적으로 동작하는 방식에 대한 이해가 필요합니다.
기본적으로 JPA의 SEQUENCE 전략은 데이터베이스 시퀀스에서 값을 가져와 엔티티의 ID를 자동으로 생성하는 방법입니다. allocationSize를 설정하면, JPA는 해당 값만큼의 시퀀스 값을 한꺼번에 가져와 메모리에 저장해두고 사용합니다. 이를 통해 데이터베이스 접근을 줄여 성능을 개선하는 효과가 있습니다. 설명하신 동작 과정은 전반적으로 맞습니다. 하지만 추가적인 부분을 설명드리면 다음과 같습니다:
초기 메모리 시퀀스 확보: em.persist()가 처음 호출되면, JPA는 데이터베이스 시퀀스에서 allocationSize만큼 값을 가져옵니다. 이를 통해 메모리에 ID 값을 준비해두고, 그 값들을 순차적으로 사용합니다.
시퀀스 재호출: 메모리에 있는 시퀀스 값이 소진되면, JPA는 다시 데이터를 가져와 allocationSize만큼 메모리에 저장합니다. 이 과정에서 DB 시퀀스 값이 증가합니다. 예를 들어, allocationSize가 50이라면 처음에는 1부터 50까지, 이후에는 51부터 100까지를 가져오는 방식입니다.
질문하신 상황에서 처음 em.persist()를 호출할 때는 allocationSize만큼의 값을 미리 가져가게 되어 한 번의 시퀀스 호출이 발생하는 것으로 이해하실 수 있습니다. 하지만 여러 번 호출하는 경우, 그 과정 내에서 메모리에 저장된 시퀀스 값들이 소모되고, 추가적으로 다음 세트를 가져와야 하는 상황이 발생할 수 있는 것입니다. 이때 추가적인 시퀀스 호출이 발생하게 됩니다.
관련된 내용을 이해하는 데 도움이 될 수 있는 기존 답변 몇 가지를 공유드립니다:
1. SEQUENCE 전략 초기값과 호출 횟수 문의드립니다.
위 게시물들에서 제공되는 답변을 통해 allocationSize와 call next value에 대한 이해를 보다 깊이 있게 할 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.