
참고
플러시
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
- 보통 DB 트랜잭션이 커밋될때, flush 발생
- DB와 영속성 컨텍스트의 상태를 같게한다.
플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)
- flush가 발생되면 1차캐시는 날라가지 않고 유지된다.
영속성 컨텍스트를 플러시 하는 방법
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
JPQL 쿼리 실행 시, 플러시가 자동으로 호출되는 이유
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
query = em.createQuery("select m from Member m", Member.class);
List<Member> members= query.getResultList();
- 위의 코드처럼 작성될때, 플러시가 자동으로 호출 안되면 쿼리결과는 비어있을것이다.
플러시 모드 옵션
em.setFlushMode(FlushModeType.COMMIT)
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때, 플러시 (기본 값)
- FlushModeType.COMMIT : 커밋할때만 플러시
결론
- 플러시는 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨