본문 바로가기

jpa

jpa의 @Batchsize 동작방식

@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