끄적끄적
[jpa] 2차 캐시 사용하기(ehcache) 본문
- 설정
(ehcache에 대한 설정이 준비되어있어야 한다. 즉, ehcache.xml 필요)
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.2.2.Final</version>
</dependency>
- 사용중인 하이버네이트 버전과 동일한 버전을 디펜던시에 추가를 해야한다.(이 경우에는 5.2.2.Final)
properties
###JPA 2차 캐시 관련 옵션#####
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
### 캐싱모드 종류 ####
#All : entities are cached
#NONE : Disable caching
#ENABLE_SELECTIVE : Enable caching only for those entities which has @Cacheable(true)
#DISABLE_SELECTIVE : Enable caching only for those entities which are not specified with @Cacheable(false)
#UNSPECIFIED : Applies persistence provider-specific default behavior
### 필요한 경우 사용 ####
#spring.cache.ehcache.config=classpath:ehcache.xml
#hibernate.cache.use_second_level_cache=true
#hibernate.cache.use_query_cache=true
#hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
- 어떤 엔티티를 캐시할 것인지에 대한 전략을 설정 가능
entity에 적용(위의 설정을 적절히 고려해야한다.)
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Foo {
//생략....
- 캐시 저장소 이름은 엔티티 클래스명에 기반한다.
- CacheConcureencyStrategy 값을 설정하여 동시성에 관한 전략을 정할 수 있다.
- READ_ONLY
절대 변경되지 않는 엔티티에만 사용됨(이러한 엔티티를 업데이트하려고 할 경우 예외가 발생함).
변경되지 않는 정적 참조 데이터에 매우 적합
- NONSTRICT_READ_WRITE
영향을 받는 데이터를 변경한 트랜잭션이 커밋된 후 캐시가 업데이트된다.
따라서, 강력한 일관성은 보장되지 않으며 캐시로부터 오래된 데이터를 얻을 수 있는 작은 시간대가 있다.
이러한 전략은 궁극적인 일관성을 허용할 수 있는 사용 사례에 적합하다.
- READ_WRITE
이 전략은 '소프트' 잠금장치를 사용하여 달성하는 강력한 일관성을 보장한다. 캐시된 엔티티가 업데이트되면 해당 엔티티에 대한 캐시에 소프트 락도 저장되며, 이 잠금은 트랜잭션이 실행된 후에 해제된다. 소프트 락된 항목에 액세스하는 모든 동시 트랜잭션은 데이터베이스에서 해당 데이터를 직접 가져온다.
- TRANSACTIONAL
캐시 변경은 분산 XA 트랜잭션에서 수행된다. 캐시된 엔티티의 변경이 동일한 XA 트랜잭션에서 데이터베이스와 캐시에서 모두 커밋되거나 롤백됨 - 콜렉션은 캐시되지 않음으로, 명시적으로 설정하여야 한다.
ex) @OneToMany에 @Cachable과 @Cache 어노테이션을 추가
이 경우, 엔티티의 ID만을 캐시한다.
저장소의 이름은 "엔티티명.컬렉션명"으로 정의된다
참고 : https://www.baeldung.com/hibernate-second-level-cache
'개발' 카테고리의 다른 글
[http] https 작동원리 (1) | 2020.04.06 |
---|---|
[jpa] 테이블 이름 매핑전략 설정하기 (0) | 2020.04.03 |
[java] 람다 Functional Interface (0) | 2020.03.12 |
[CI/CD] travis + aws codedeploy 사용하기 (0) | 2020.03.09 |
[jpa] querydsl BooleanBuilder 사용하기 (0) | 2020.03.09 |
Comments