티스토리 뷰

Books

[JPA] 벌크 연산이란?

Aaron 2020. 12. 23. 10:33
반응형


|| 벌크 연산


--

- 여러 건(대량의 데이터)을 한 번에 수정하거나 삭제하는 방법

- 벌크 연산은 executeUpdate() 메소드 사용

- 영향을 받은 엔티티 건수 반환


c. (여러 건 수정) 재고가 10개 미만인 모든 상품의 가격을 10% 상승

1
2
3
4
5
6
7
8
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();
cs


c. (여러 건 삭제) 가격이 100원 미만인 상품 삭제

1
2
3
4
5
6
7
String qlString = 
    "delete from Product p" +
    "where p.price < :price";
 
int resultCount = em.createQuery(qlString)
                    .setParameter("price"100)
                    .excuteUpdate();
cs




|| 주의점


--

- 벌크 연산은 영속성 컨텍스트와 2차 캐시를 무시하고 데이터베이스에 직접 쿼리한다는 점을 주의

- 조회 후 벌크 연산을 수행했을 경우,

  영속성 컨텍스트에 있는 상품A와 데이터베이트에 있는 상품A의 가격이 다를 수 있음

  (영속성 컨텍스트와 데이터베이스 간에 데이터 차이 발생)


||| 해결 방법


--

> em.refresh() 사용

- 벌크 연산 수행 직후 정확한 상품A 엔티티를 사용해야 한다면,

  em.refresh(productA)를 사용하여 데이터베이스에서 상품A를 다시 조회


> 벌크 연산 먼저 실행

- 가장 실용적인 해결책

- JPA와 JDBC를 함께 사용할 때도 유용


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

- 영속성 컨텍스트에 남아 있는 엔티티를 제거하는 방법





출처 : 자바 ORM 표준 JPA 프로그래밍

반응형

'Books' 카테고리의 다른 글

[Spring + JPA] Make Web Application (2)  (0) 2020.12.24
[Spring + JPA] Make Web Application (1)  (0) 2020.12.23
[JPA] 네이티브 SQL 정리  (0) 2020.12.23
[JPA] QueryDSL 정리  (0) 2020.12.22
[JPA] JPQL Query 정리  (0) 2020.12.22
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday