반응형
JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다.
1차 캐시와 2차 캐시
네트워크를 통해 데이터베이스에 접근하는 시간 비용은 애플리케이션 서버 내부 메모리에 접근하는 시간보다 훨씬 비싸다.
따라서 조회한 데이터를 메모리에 캐싱해 두면 데이터베이스 접근 횟수를 줄여 성능을 개선할 수 있다.
1차 캐시
영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데 이를 1차 캐시라고 한다.
일반적으로 트랜잭션을 시작하고 종료할 때까지만 1차 캐시가 유효하다.
OSIV를 사용하더라도 사용자의 요청이 들어올 때부터 끝날 때까지만 1차 캐시가 유효하다.
특징
같은 엔티티가 있으면 객체 동일성을 보장한다. (==)
2차 캐시
애플리케이션 범위의 캐시로, 공유 캐시라고도 한다.
따라서 애플리케이션을 종료할 때 까지 캐시가 유지된다.
특징
2차 캐시는 동시성을 극대화하기 위해 캐시 한 객체를 직접 반환하지 않고 복사본을 만들어서 반환한다.
여기서 복사본을 반환하는 이유는 캐시 한 객체를 그대로 반환하면 여러 곳에서 같은 객체를 동시에 수정하는 동시성 문제가 발생할 수 있음
이를 해결하기 위해서 객체에 락을 걸어야 하는데 이러면 동시성이 떨어질 수 있다.
그래서 2차 캐시는 원본 대신에 복사본을 반환한다.
영속성 컨텍스트가 다르면 객체 동일성을 보장하지 않는다 (==)
반응형
'Application > JPA' 카테고리의 다른 글
[JPA] @Transaction(readOnly=true) 성능 향상 이유? (3) | 2021.02.22 |
---|---|
[JPA] 영속성 컨텍스트와 트랜잭션, OSIV (0) | 2021.02.22 |
[JPA] 트랜잭션 범위와 영속성 컨텍스트, Fascade 계층 (0) | 2021.02.22 |
[JPA] JPQL 객체지향 쿼리 심화 (0) | 2021.02.21 |
[JPA] 지연 로딩 N+1 문제와, JPQL 페치 조인 (0) | 2021.02.21 |