티스토리 뷰

 

플러시

- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영

 

플러시 발생

- 변경 감지

- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록

- 쓰기지연SQL저장소의 쿼리를 데이터베이스에 전송(등록,수정,삭제 쿼리)

 

영속성 컨텍스트를 플러시 하는 방법

- em.flush() 직접호출

- 트랜잭션 커밋 - 플러시 자동 호출

- JPQL 쿼리 실행 - 플러시 자동 호출

 

 

만약 아래와 같이 flust()를 직접 호출할 경우

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

            entityManager.flush();//즉시 디비에 쿼리를 날린다.

            System.out.println("======");
            ts.commit();

Hibernate: 
    /* insert helloJpa.Member
        */ insert 
        into
            member
            (name, id) 
        values
            (?, ?)
======

 

이와 같은 오류가 된다. flush() 시점에서 쿼리가 날라간다.

 

주의점으로는 1차캐시에서 지워지진 않으니 쿼리를 날리는 것으로 동작이 끝났다고 생각하지 않는 것을 주의해야한다. (1차 캐시는 하나의 요청에서는 계속 유지된다.)

 

인프런 - 김영한 jpa 강의 중

 

 

여기서 주의해야 할 것이 또 있다.

 

JPQL쿼리를 실행 할 때에 자동으로 flush()가 호출 된다.

 

em.persist(memberA);
em.persist(memberB);

//중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

 

위와 같은 코드일 경우 persist는 1차캐시에만 존재하게 된다. 만약 flush가 안된 경우 JPQL로 호출하면 db에 데이터가 없으므로 조회 할때에 문제가 생긴다. 그래서 JPQL을 날리면 그 전에 flush가 된 후 변경 혹은 추가 된 데이터 상태에서 불러오게 된다.

 

인프런 - 김영한 강의 중

 

정 원한다면 이렇게 FlushModeType을 이용해서 바꿀 수 있지만 보통 기본값으로만 사용한다.

 

플러시

- 영속성 컨텍스트를 비우지 않음

- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화

- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화함녀 됨

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함