-
#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() : 영속성 컨텍스트를 종료
'JPA' 카테고리의 다른 글
#JPA-8 데이터베이스 스키마 자동 생성 & 필드와 컬럼 매핑 (0) 2021.02.15 #JPA-7 엔티티 매핑 (0) 2021.02.15 #JPA-5 영속성 컨텍스트(2) (0) 2021.02.15 #JPA-4 영속성 컨텍스트(1) (0) 2021.02.15 #JPA-3 JPA 객체와 TABLE 매핑 & JPA 동작 확인 & JPQL정의 (0) 2021.02.15