공부/Spring
[Java] @Transaction(readOnly=true)을 사용하면 성능이 향상되는 이유
by JERO__
2022. 5. 7.
결론
- 엔티티를 읽기 전용으로 조회하면, 변경감지를 위한 스냅샷을 유지하지 않아도 되고, 영속성 컨텍스트를 플러시하지 않아도 돼 성능을 최적화 할 수 있다.
사용방법
@Transaction(readOnly=true)
성능 향상 이유
1. 스칼라 타입(단일데이터)으로 조회 (엔티티로 조회하지 않음)
- 영속성 컨텍스트가 결과를 관리하지 않는다.
- 엔티티로 조회한다면?
- 영속성 컨텍스트에 관리됨
- 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경. 어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB역할.
- 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관한다. (많은 메모리 사용)
2. 읽기 전용 쿼리 힌트 사용
- org.hibernate.readOnly 사용
- 읽기전용이므로, 스냅샷을 보관하지 않는다 → 메모리 최적화
3. 플러시가 발생하지 않는다.
- 플러시(Flush) : 영속성 컨텍스트의 변경내용 → DB에 반영 (영속성 컨텍스트의 변경사항을 DB상태와 맞추는 작업)
- 플러시모드가 MANUAL로 설정된다. 따라서, 등록, 수정, 삭제가 동작하지 않는다.
댓글