ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #JPA-6 플러시 & 준영속 상태
    JPA 2021. 2. 15. 19:19

    [출처] 인프런 김영한 강사님 -자바 ORM 표준 JPA 프로그래밍 기본

    1. 플러시(DB Transcation commit 될때 flush 발생)

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

    - 영속성 컨텍스트의 변경사항과 DB를 맞추는 작업 

    - 영속성 컨텍스트의 CRUD 쿼리들을 DB에 반영하는 작업

    1-1. 플러시 발생

    • 변경 감지

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

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

     

    1-2. 영속성 컨텍스트를 플러시하는 방법

    • em.flush() - 직접 호출

                Member member = new Member(200l,"member200");
    
                em.flush(); //db에 쿼리 즉시 발생
                System.out.println("=======================");
                tx.commit(); //commit시점에 query가 날라가게 된다.

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

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

     

    1-3. JPQL 쿼리 실행시 플러시가 자동 으로 호출되는 이유

    JPQL에서 실행하면 DB에 쿼리를 실행할때 무조건 FLUSH를 날려버리기 때문에 조회가능

     

    1-4. 플러시 모드 옵션

    em.setFlushMode(FlushModeType.COMMIT)

    거의 쓸일은 없고 기본값은 AUTO이다.

     

    • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)

     

    • FlushModeType.COMMIT : 커밋할 때만 플러시

    ( 쿼리를 실행할때는 FLUSH를 안한다. EX)JPQL을 쓸때 JPQL을 하면 자동으로 쿼리가 나가버리기때문에)

     ex) 위에 코드에서 만약 member가아니라 상품을 가져올경우 flush해서 얻을 수 있는 이점이 없다. 

    근데 그냥 auto로 쓰는 걸 권장한다.

     

    1-5. 플러시는!

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

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

    트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화(변경내용을 DB에 날리기만) 하면 됨

     

    2. 준영속 상태

    • 영속(persist이외에도 find를 해서 가져와서 1차캐시에 넣었을경우 ) -> 준영속

    • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)

    • 영속성 컨텍스트가 제공하는 기능을 사용 못함

     

    2-1.준영속 상태로 만드는 방법

    • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환

    • em.clear() : 영속성 컨텍스트를 완전히 초기화(1차 캐시를 다 지워버림)

    • em.close() : 영속성 컨텍스트를 종료

    댓글

Designed by Tistory.