Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

플러시, 준영속 상태, 정리 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

플러시, 준영속 상태, 정리

Seung__ 2021. 8. 8. 23:07

 

1. 플러시


  • 영속성 컨텍스트의 변경 내용을 DB에 반영
  • tx.commit() 실행되면 내부적으로 flush()실행됨.
  • flush() 호출되면?? 무슨일이?
    - 변경감지, dirty checking
    - 수정된 엔티티 관련된 SQL을 생성하여 쓰기 지연 SQL저장소에 등록
    - 쓰기지연 SQL 저장소의 쿼리를 DB에 전송(등록, 수정, 삭제)
  • 영속성 컨텍스트를 flush하는 방법
    - em.flush() 직접하든가
    - tx.commit() 호출하면 flush() 자동으로 호출 됨.
    - JPQL 쿼리 실행하면  flush 자동 호출.
      만약 persist(entity)하고 바로 JPQL을 통해 모든 엔티티 조회하면 DB에 반영이 안되어있기 때문에 불러올 수 없다.
      따라서 JPA는 JPQL실행시 flush가 자동으로 호출해서 문제가 없도록 지원함.
  • 해보자.
Member member = new Member(500L, "member500");
em.persist(member);
em.flush();
System.out.println("=====================");
tx.commit(); //commit하는 시점에 쿼리 날라감.
  • commit전에 flush로 인해 쿼리가 날라갔다!
Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)
=====================
22:41:21.107 [main] DEBUG org
  • flush는 단지 쓰지지연 SQL 저장소에 있는 쿼리를 반영하는 것.
  • 1차캐시는 안없어짐 ㅋㅋㅋ
  • FlushModeType. --> 가급적 손대지ㅣ..말자..
    - AUTO : 커밋이나 쿼리를 실행할 대 플러시(기본)
    - COMMIT : commit()할 때 만 플러시.
  • 플러시는!
    - 영속성 컨텍스트를 비우지 않음, 1차 캐시를 비우지 않음
    - 쓰기 지연 SQL저장소에 모인 SQL을 DB로 밀어냄
    - 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
    - Transaction이라는 작업 단위가 중요 -> commit 직전에만 동기화 하면 됨~~~

 

 

2. 준영속 상태(detached)


  • 영속 -> 준영속
  • 1차 캐시에 올라간 상태가 영속상태
  • 영속 상태의 entity가 영속성 컨텍스트에서 분리(detatched)
  • 영속성 컨텍스트가 제공하는 기능 사용 못함(dirty checking)
  • 준영속 상태로 만드는 방법
    - em.detatch(entity) : 특정 엔티티만 준영속 상태로 전환
    - em.clear : 영속성 컨텍스트초기화 --> 관리 대상을 없애버림
    - em.close : 영속성 컨텍스트 종료 --> 관리 주체를 없애버림 ㅋㅋㅋ
  • 해보자.
                //em.find를 통해 가져온 member는 영속상태
                Member member = em.find(Member.class, 500L);
                member.setName("wow");
                
                //준영속 상태로 바꿈
                em.detach(member);
    
                //commit 할 때 member의 업데이트 반영 안됨.
                tx.commit();​
  • select 쿼리만 돌아가고 update 쿼리는 안돌아간다.
  • 영속상태인 member의 name을 변경했지만.
  • 준영속 상태로 변경했기 때문에. member는 영속성 컨텍스트에서 관리하지 않는다.
  • 따라서 commit 시점에 dirty checking의 대상이 아님.
  • 그러므로 update 쿼리 실행 안됨.
Hibernate: 
    select
        member0_.id as id1_0_0_,
        member0_.name as name2_0_0_ 
    from
        Member member0_ 
    where
        member0_.id=?

 

3. GitHub : 210808 Persistence Context


 

GitHub - bsh6463/JPA

Contribute to bsh6463/JPA development by creating an account on GitHub.

github.com

 

Comments