작성
·
395
1
hibernate.jdbc.batch_size 를 2로 주고,
영속성 컨텍스트에 4개의 엔티티를 저장하면
결국에 트랜젝션 커밋시점에 4개의 쿼리가 나가는데..
여기서 궁금한게 있어서 질문을 드립니다.
1) 배치사이즈가 2이고 엔티티가 4개가 저장되어있다면, 배치 사이즈 크기에 해당하는 2개의 엔티티를 저장하는 쿼리가 실행될꺼 같았는데 아닌가요?
2) 테스트해본 결과 4개의 insert 쿼리가 내보내지는데 이 시점에 배치에 해당하는 최적화가 이루어지는건가요? 대용량으로 배치작업으로 어떠한 이점이 있는지 알고 싶어서 질문드립니다.
그리고 유익한 강의 매우 재밌게 잘 듣고 있습니다. 감사합니다.
답변 1
3
안녕하세요. youngyun jo님^^ 좋은 질문입니다.
쿼리는 4번이 보이는 것이 맞습니다^^
최적화 부분을 눈으로 확인해보고 싶으면 하이버네이트 로그를 다음과 같이 디버그 레벨로 찍어보시면 됩니다.
logging.level.org.hibernate: debug
그러면 중간에 다음과 같은 로그들을 볼 수 있습니다.
2020-07-15 23:09:33.834 DEBUG 99097 --- [ main] o.h.e.jdbc.batch.internal.BatchingBatch : Executing batch size: 2
한번에 2개의 배치로 쿼리가 실행되었다는 뜻이지요.
이 방법의 장점은 네트워크 반복 횟수가 줄어든다는 것에 있습니다.
상황에 따라 다르겠지만, 이 방법으로 실무에서 대용량 INSERT 작업에서 시간을 50% 정도 감축한 적이 있습니다.
참고: 식별자 모드가 IDENTITY인 경우는 DB에 값을 넣고 바로 PK를 꺼내야 하므로, 이 최적화를 사용할 수 없습니다.
감사합니다^^