본 글은 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 책을 기반으로 정리한 내용입니다.
엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 이점이 많다. 하지만 영속성 컨텍스트는 변경 감지를 위해 스냅샷 인스턴스를 메모리에 보관하므로 메모리를 많이 사용한다는 단점이 있다.
아래의 예시 사항을 참고하여 보자.
다음 JPQL 쿼리를 최적화 해보자.
select o from Order o
select o.id, o.name, o.price from Order oTypeQuery<Order> query = em.createQuery("select o from Order o", Order.class);
query.setHint("org.hibernate.readonly", true);@Transactional(readOnly = true)트랜잭션 없이 엔티티를 조회한다는 의미로 조회 성능이 향상된다.
조회가 목적일 때만 사용해야 한다.
// spring
@Transactional(propagation = Propagation.NOT_SUPPORTED)
// J2EE
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED))
읽기 전용 데이터 조회
- 메모리 최적화
- 스칼라 타입으로 조회
- 하이버네이트가 제공하는 읽기 전용 쿼리 힌트 사용
- 속도 최적화
- 읽기 전용 트랜잭션 사용
- 트랜잭션 밖에서 읽기
(참고: 스프링 프레임워크의 경우 읽기 전용 트랜잭션을 사용하는 것이 편리)
읽기 전용 트랜잭션과 읽기 전용 쿼리 힌트를 동시에 사용하는 것이 가장 효과적
Transactional(readOnly = true) (1). 읽기 전용 트랜잭션 public ... () { return em.createQuery("select ...", ...class) .setHint("org.hibernate.readOnly", true) // (2). 읽기 전용 쿼리 힌트 .getResultList(); } (1). 읽기 전용 트랜잭션 사용: 플러시를 작동하지 않아 성능 향상 (2). 읽기 전용 엔티티 사용: 엔티티를 읽기 전용으로 조회하여 메모리 절약