JAVA

[JAVA] JPA 플러시(flush)

응디 2021. 11. 9. 12:58

플러시 발생

  1. 변경감지
  2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송( 등록, 수정, 삭제 쿼리 )
보통 transaction.commit과 동시에 쿼리를 DB에 날리는데
내가 쿼리를 미리 보고싶거나, DB에 먼저 넣고 싶을때 사용!

 

아래 예시를 보면 commit이 실행되기 전에 insert문이 먼저 실행된다.

Member member = new Member(200L, "member200");
em.persist(member);

em.flush();
            
System.out.println("=======================");

tx.commit(); // commit을 실행하면서 쿼리를 DB에 날림

실행 예시

 

 JPQL 쿼리 실행 시에는 플러시가 자동으로 실행된다!

// persist만 해주고 아직 commit이 안됐으니 DB에 삽입 전이다.
em.persist(mamberA);
em.persist(mamberB);
em.persist(mamberC);

// 이때 JPQL로 전체 멤버를 검색하면 아직 commit 되지 않아 데이터가 없기에 에러가 생길수 있음!
// 따라서 JPQL 전에는 무조건 플러시를 진행하고 실행시킨다.
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

 

플러시 모드 옵션

  1. FlushModeType.AUTO( default 값 ) : 커밋이나 쿼리를 실행 할 때 플러시
  2. FlushModeType.COMMT : 커밋할 때만 플러시 ( JPQL를 사용하기 전에 굳이 플러시를 안해도 될때 사용 - 잘 안씀)

※ 플러시 정리

  • 플러시를 실행한다고 영속성 컨텍스트를 비우지 않음( 1차캐시도 비우지 않음 )
  • 영속성 컨텍스트 변경내용을 DB에 동기화
  • 트랜잭션이라는 단위가 중요하다! → 커밋 직전에만 동기화 하면됨