JPA

2월 20일 JPA JPQL- 벌크연산

Chaerin Yoo 2023. 2. 20. 16:55

JPQL- 별크연산

-재고가 10개 미만인 모든 상품의 가격을 10%인상한다면?

-JPA변경감지 기능으로 실행하려면 너무많은 SQL의 update문이 발생

ㄴ1.재고가 10개 미만인 상품을 리스트로 조회한다

ㄴ2.상품 엔티티의 가격을 10%증가한다.

ㄴ3.트랜잭션 커밋 시점에 변경감지가 동작한다.

-변경된 데이터가 100건 이라면 100번의 update SQL을 실행한다.

 

벌크 = 1건씩 insert/update 하는것을 제외한 모든 insert / update 문

벌크연산 = 쿼리한번으로 같은 내용을 모두 적용

-쿼리 한번으로 여러 테이블 모두 변경(엔티티)

-executeUpdate()의 결과는 영향받는 엔티티수 반환

-Update , Delete 지원

-Insert(insert into ... select , 하이버네이트 지원)

 

ex) 벌크 후

String qlString = "update product p "+

"set p.price = p.price * 1.1" +

"where p.stockAmount < :stockAmount" 

 

int resultCount = em.createQuery(qlString)

.setParameter("stockAmount" , 10)

.executeUpdate(); //이 단계에서 벌크연산을 명령

 

//특별히 다른게 아니라 1건의 SQL 이 다수에 적용되는 SQL을 말한다.

벌크연산 주의 (잘못 사용하면 꼬인다 . 벌크먼저 그 후 영속성 초기화)

-벌크연산은 영속성 컨텍스트를 무시하고 데이터 베이스에 직전쿼리

-벌크 연산을 먼저 실행

-벌크 연산 수행 후 영속성 컨텍스트 초기화

-벌크 실행직전 자동 flush된다. (SQL이 실행되기 때문)

-벌크만 실행되면 그 결과가 영속성이 되지 않기 떄문에 DB에 반영되지만 JPA영속성에는 반영되지 않기 때문에

flush가 필요하다.

 

벌크 순서

1.벌크 실행시 flush

2.벌크 값이 DB에만 반형 , JPA에는 미반영

3.일단 JPA 영속성 clear // 초기화

4.영속성 값을 db에서 다시 가져와서 1차캐시 채우기.