JPA - 영속성 컨텍스트(2)

DevSeoRex·2022년 10월 15일
1
post-thumbnail
post-custom-banner

Flush와 준영속상태

데이터베이스에서 엔티티를 조회

Member findMember2 = em.find(Member.class, "member2");
  1. find("member2") -> 1차 캐시에 없음
  2. DB 조회
  3. 1차 캐시에 저장

EntityManager의 1차 캐시는 한 Transaction 안에서만 공유된다.

똑같은 데이터를 조회하면 최초에는 SQL을 실행하지만, 두번째 부터는 1차 캐시 안에있는 데이터를 가져온다.

영속 엔티티의 동일성 보장

1차 캐시로 반복 가능한 읽기(REPEATABLE READ)등급의 트랜잭션 격리 수준을 데이터베이스가 아닌
애플리케이션 차원에서 제공

플러시(Flush)

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

플러시 발생

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

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

  • em.flush() - 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

플러시의 특징

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨

준영속 상태

영속 -> 준영속
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
영속성 컨텍스트가 제공하는 기능을 사용 못함

준영속 상태로 만드는 방법

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

  • em.clear()
    영속성 컨텍스트를 완전히 초기화

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

출처 : (인프런 : 자바 ORM 표준 JPA 프로그래밍 - 기초편)

post-custom-banner

0개의 댓글