JVM/JPA

읽기 전용 쿼리의 성능 최적화

kyoulho 2023. 7. 4. 20:28

영속성 컨텍스트는 변경 감지를 위해 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다.

다시 조회할 일도 수정할 일도 없이 딱 한 번만 읽어서 화면에 출력하면 될 때는 읽기 전용으로 엔티티를 조회하면 메모리 사용량을 최적화할 수 있다.

메모리를 최적화하려면 하이버네이트가 제공하는 읽기 전용 쿼리 힌트를 사용하고, 플러시 호출을 막아서 속도를 최적화하려면 읽기 전용 트랜잭션을 사용하는 것이 가장 효과적이다.

 

스칼라 타입으로 조회

스칼라 타입은 영속성 컨텍스트가 결과를 관리하지 않는다.

SELECT o.id, o.name, o.price FROM Order o

 

읽기 전용 쿼리 힌트 사용

하이버네이트 전용 힌트인 org.hibernate.readOnly를 사용하면 읽기 전용으로 조회할 수 있다.

이 기능은 스냅샷을 보관하지 않는다.

TypedQuery<Order> query = em.createQuery("SELECT o FROM Order o", Order.class);
query.setHint("org.hibernate.readOnly", true);

 

읽기 전용 트랜잭션 사용

읽기 전용 트랜잭션을 사용하면 스프링 프레임워크가 하이버네이트 세션의 플러시 모드를 MANUAL로 설정한다. 이렇게 하면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다.

영속성 컨텍스트를 플러시 하지 않으니 엔티티의 등록, 수정, 삭제는 당연히 동작하지 않는다.

@Transactional(readOnly = true)

 

트랜잭션 밖에서 읽기

트랜잭션 없이 엔티티를 조회한다는 뜻이다.

@Transactional(propagation = Propagation.NOT_SUPPORTED)

'JVM > JPA' 카테고리의 다른 글

트랜잭션을 지원하는 쓰기 지연  (0) 2023.07.04
SQL 쿼리 힌트 사용  (0) 2023.07.04
N+1 문제  (0) 2023.07.04
영속성 컨텍스트와 프록시  (0) 2023.07.03
JPA 예외 처리  (0) 2023.07.03