1) 플러시란?
- 플러시란 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미합니다.
보통 DB 트랜잭션이 커밋될 때, 플러시가 일어납니다.
즉, 영속성 컨텍스트의 쿼리들을 DB에 날리게 됩니다.
2) 플러시 발생
- 플러시가 발생하면 다음과 같은 일들이 일어납니다.
(1) 변경 감지
(2) 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록
(3) 쓰기 지연 SQL 저장소의 쿼리(등록, 수정, 삭제)를 데이터베이스에 전송
3) 영속성 컨텍스트를 플러시하는 방법
(1) em.flush() - 직접 호출
(2) 트랜잭션 커밋 - 플러시 자동 호출
(3) JPQL 쿼리 실행 - 플러시 자동 호출
단, 플러시를 한다고 해서 1차 캐시가 지워지는 것은 아닙니다.
try{
Member member = new Member(200L, "member200");
em.persist(member);
em.flush();
System.out.println("==================");
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
em.close();
}
4) JPQL 쿼리 실행 시 플러시가 자동으로 호출되는 이유
- JPA는 JPQL 쿼리를 실행할 때, 무조건 flush를 합니다.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
5) 플러시 모드 옵션
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(기본값)
- FlushModeType.COMMIT: 커밋할 때만 플러시
6) 결론
- 플러시는 영속성 컨텍스트를 비우지 않음
- 플러시는 영속성 컨텍스트의 변경 내용을 DB에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨
- 준영속
1) 준영속이란?
- 준영속 상태란 영속 상태의 엔티티를 영속 상태에서 분리하는 것을 의미합니다.
엔티티가 준영속 상태가 되면 영속성 컨텍스트가 제공하는 기능을 사용하지 못하게 됩니다.
2) 준영속 상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear(): 영속성 컨텍스트를 완전히 초기화
- em.close(): 영속성 컨텍스트를 종료
참고
김영한 자바 ORM 표준 JPA 프로그래밍
'자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
연관관계 매핑 기초 (0) | 2022.09.07 |
---|---|
엔티티 매핑 - 객체와 테이블 매핑 & 데이터베이스 스키마 자동 생성 (0) | 2022.08.31 |
영속성 컨텍스트(2) - 1차 캐시, 동일성 보장, 쓰기 지연, 변경 감지 (0) | 2022.08.31 |
영속성 컨텍스트(1) - 개념 (0) | 2022.08.28 |
JPA 기초(2) - JPA란? (0) | 2022.08.24 |