250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 데코레이터
- JPQL
- 즉시로딩
- 힙
- FetchType
- 동적sql
- 유니크제약조건
- eager
- SQL프로그래밍
- 연관관계
- 이진탐색
- 백트래킹
- BOJ
- shared lock
- 연결리스트
- fetch
- 스토어드 프로시저
- execute
- 다대일
- dfs
- 스프링 폼
- 일대다
- querydsl
- 다대다
- exclusive lock
- PS
- CHECK OPTION
- 비관적락
- 낙관적락
- 지연로딩
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
읽기 전용 쿼리의 성능 최적화 - @Transactional(readonly=true), setHint(readonly) 본문
728x90
# 엔티티가 영속성 컨텍스트에 관리되면...
- 장점 : 1차캐시, 변경 감지
- 하지만 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용한다.
읽기 전용으로 엔티티를 조회하면 메모리 사용량을 최적화 할 수 있다.
# 스칼라 타입으로 조회
select o.id, o.name from Order o
- 스칼라 타입은 영속성 컨텍스트가 결과를 관리하지 않는다.
# 읽기전용 쿼리 힌트 사용
TypedQuery<Order> query =
em.createQuery("select o from Order o", Order.class);
query.setHint("org.hibernate.readOnly", true);
- 엔티티를 읽기 전용으로 조회한다.
- 읽기 전용이므로 영속성 컨텍스트는 스냅샷을 보관하지 않는다.
- 따라서 메모리 사용량을 최적화할 수 있다.
- 단 스냅샷이 없으므로 엔티티를 수정해도 데이터베이스에 반영되지 않는다.
# 읽기 전용 트랜잭션 사용
@Transactional(readOnly = true)
- 트랜잭션에 readOnly = true 옵션을 주면 스프링 프레임워크가 하이버네이트 세션의 플러시 모드를 MANUAL 로 설정한다.
- 이렇게 하면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다.
- 따라서 트랜잭션을 커밋해도 영속성 컨텍스트를 플러시하지 않는다.
- 영속성 컨텍스트를 플러시하지 않으니 엔티티의 등록, 수정, 삭제는 당연히 동작하지 않는다.
- 하지만 플러시할 때 일어나는 스냅샷 비교와 같은 무거운 로직들을 수행하지 않으므로 성능이 향상된다.
- 물론 트랜잭션을 시작했으므로 트랜잭션 시작, 로직수행, 트랜잭션 커밋의 과정은 이루어진다. 단지 영속성 컨텍스트를 플러시하지 않을 뿐이다.
# 결론
1. 메모리 최적화
- 스칼라 타입으로 조회하거나 하이버네이트가 제공하는 읽기 전용 쿼리힌트를 사용
2. 속도 최적화
- 읽기 전용 트랜잭션을 사용하여 플러시 호출을 막음
@Transactional(readOnly = true) //-- 1. 읽기 전용 트랜잭션
public List<DataEntity> findDatas(){
return em.createQuery("select d from DataEntity d",
DataEntity.class)
.setHint("org.hibernate.readOnly", true) //-- 2. 읽기 전용 쿼리 힌트
.getResultList();
}
- 읽기 전용 트랜잭션 : 플러시를 작동하지 않도록 해서 성능 향상
- 읽기 전용 엔티티 사용 : 엔티티를 읽기 전용으로 조회해서 메모리 절약
'JPA' 카테고리의 다른 글
트랜잭션을 지원하는 "쓰기 지연"의 진짜 장점⭐️ (0) | 2024.04.28 |
---|---|
[JPA] 배치 처리 (1) | 2024.04.28 |
[JPA] N+1 문제를 피할 수 있는 다양한 방법 (1) | 2024.04.28 |
프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다. (0) | 2024.04.28 |
테스트 환경에서 엔티티 비교 (0) | 2024.04.28 |