Develop/Spring
[querydsl] batch 성 거래 처리하기
코딩의성지
2021. 7. 8. 18:25
프로그램을 짜다보면 배치작업처럼 다량의 데이터가 업데이트 되거나 삭제되야하는 경우가 있다.
그런데 querydsl로 update 쿼리를 날리면 db의 상태와 영속성 컨택스트의 상태가 다른것을 확인할 수 있다.
영속성 컨택스트의 데이터는 그대로고 db만 값이 변경된다.
영속성 컨택스트의 1차 캐시와 동기화가 안되었기 때문이다. (JPA에서는 이를 Dirty Checking) 이라고 한다.
그래서 혹시나 내부에서 로직이 update이외에 다른게 있다면 꼭 영속성 컨택스트를 초기화 하는 과정을 넣어주는게 좋다.
long updateCnt = queryFactory
.update(member)
.set(member.userName, "babo")
.set(member.age, member.age.add(1))
.execute();
//영속성 컨택스트 초기화
em.flush();
em.clear();
List<Member> members = queryFactory
.selectFrom(member)
.fetch();
위 로직은 업데이트 후 조회하는 로직이들어가서 중간에 영속성 컨택스트를 초기화 해주지 않으면 db만 바뀌고 값의 출력은 바뀌지 않은 값이 그대로 출력된다.
만약에 아래 코드처럼 그냥 다 삭제하고 (업데이트도 마찬가지) 그 이후에 아무 로직도 없다면 따로 초기화를 안해줘도 된다.
public void allDelete() {
long deleteCnt = queryFactory
.delete(member)
.execute();
}
끝
반응형