벌크 연산(Bulk Operation)이란
update 쿼리는 각 데이터를 하나씩 갱신한다.
즉, 만약 조건(where)에 부합하는 데이터가 많게는 수만개부터 수십만개가 있다면
그 수 만큼의 update문이 일일히 날아가게 된다.
즉, 비효율적이기 때문에 한번에 대량의 데이터를 일괄적으로 수정, 삭제할 수 있는 것이
벌크 연산이다.
public void bulkUpdate() {
long count = queryFactory
.update(member)
.set(member.username, "비회원")
.where(member.age.lt(28))
.execute();
}
// long count는 쿼리에 영향을 받은 row수이다.
벌크 연산에서 주의해야할 점 !!
벌크 연산은 영속성 컨텍스트를 무시하고 다이렉트로 db로 쿼리를 보내기 때문에, db에는
반영된 변경사항이 영속성 컨텍스트에는 반영이 되지 않게 된다.
그렇기에 벌크 연산을 실행한 후에 영속성 컨텍스트를 초기화해주는 것이 좋다!!
em.flush();
em.clear();
벌크 연산 - 삭제
public void bulkDelete() }
long count = queryFactory
.delete(member)
.where(member.age.gt(18))
.execute();
벌크 연산 - 데이터 조정
public void bulkAdd() }
long count = queryFactory
.update(member)
.set(member.age, member.age.multiply(2))
.execute();
}
// !!! 빼기 및 나누기를 하고 싶다면 add(-1)을 하거나 mul(1/2)을 하면 된다!!!