Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

끄적끄적

[jpa] 2차 캐시 사용하기(ehcache) 본문

개발

[jpa] 2차 캐시 사용하기(ehcache)

으아아아앜 2020. 4. 3. 20:02

- 설정

(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

 

Comments