@Batchsize는,루트의 프라이머리키 잡고 긁어오는거임
그래서 order과 orderItem이 있고 균등분배일때,
order이 10개고,orderItem이 1000개,배치사이즈가 10이면,1000개를 다 가져오는거임
실제로
initService.dbInit1();
initService.dbInit2();
initService.dbInit3();
3개를 만들고,
1,2번은 2개만 추가(하위의하위도 각각2개),
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4);
3번에만 17개를 넣고,하위엔티티의 하위엔티티를 총 9개만들고
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2);
OrderItem orderItem3 = OrderItem.createOrderItem(book3, 10000, 1);
OrderItem orderItem4 = OrderItem.createOrderItem(book4, 10000, 1);
OrderItem orderItem5 = OrderItem.createOrderItem(book5, 10000, 1);
OrderItem orderItem6 = OrderItem.createOrderItem(book6, 10000, 1);
OrderItem orderItem7 = OrderItem.createOrderItem(book7, 10000, 1);
OrderItem orderItem8 = OrderItem.createOrderItem(book8, 10000, 1);
OrderItem orderItem9 = OrderItem.createOrderItem(book9, 10000, 1);
OrderItem orderItem10 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem11 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem12 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem13 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem14 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem15 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem16 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem17 = OrderItem.createOrderItem(book1, 10000, 1);
저렇게 넣고나서
배치사이즈를 4로 잡았을때
@BatchSize(size = 4)
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
루트쿼리 1번과 바로밑 쿼리 1번,밑의 밑 쿼리 1번,총 3번이 나가는걸 알수있음
루트쿼리(길어서 생략)
하위쿼리
select o1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_price from order_item o1_0 where o1_0.order_id in(1,2,3);
하위의 하위쿼리(dbinit1번 2개,dbinit2번2개,dbinit3번9개 총 13개)
select i1_0.item_id,i1_0.dtype,i1_0.name,i1_0.price,i1_0.stock_quantity,i1_0.artist,i1_0.etc,i1_0.author,i1_0.isbn,i1_0.actor,i1_0.director from item i1_0 where i1_0.item_id in(1,2,3,4,5,6,7,8,9,10,11,12,13);
결론:하위로 몇번이 뻗든간에,배치사이즈는 루트엔티티의 프라이머리키 갯수로 페이징을 한다
즉 게시글을 메인으로 잡고, 배치사이즈를 10으로 잡고 쿼리를 날리면,그중 한 게시글에 댓글이 3억개가 달려도 다 가져온다,그래서 항상 일정한 갯수의 페이징이 가능해지는거
'jpa' 카테고리의 다른 글
jpa와 mysql 비관적락 사용시 주의점 (0) | 2024.11.17 |
---|---|
n+1문제 종류별 해결법 (0) | 2024.10.02 |