사용자 도구

사이트 도구


java:jpa:cache

문서의 이전 판입니다!


JPA Second Level Cache

  • Hibernate 4 기반으로 살펴보는 JPA2 Second Level Cache.
  • 아직까지 살펴본바로는, JPA 2의 @Cacheable애노테이션보다는 그냥 @org.hibernate.annotations.Cache를 사용하고 쿼리 캐시 힌트로 hibernate 기반으로 사용하는게 나은 듯 하다.
  • 아래 나오는 Property Key의 대부분은 Environment 클래스에 상수로 정의 돼 있다.

Hibernate Cache 활성화

Map<String,Object> props = new HashMap<String,Object>();
 
// hibernate.cache.use_second_level_cache
props.put(Environment.USE_SECOND_LEVEL_CACHE, true); 
 
// hibernate.cache.use_query_cache
props.put(Environment.USE_QUERY_CACHE, true);
 
// hibernate.cache.region.factory_class - 캐시 구현체 지정
props.put(Environment.CACHE_REGION_FACTORY, CachingRegionFactory.class.getName());
 
// hibernate.cache.region_prefix
props.put(Environment.CACHE_REGION_PREFIX, "cachetest");
 
// hibernate.cache.default_cache_concurrency_strategy
props.put(Environment.DEFAULT_CACHE_CONCURRENCY_STRATEGY, CacheConcurrencyStrategy.READ_WRITE); 
 
// ...
EntityManagerFactory emf = Persistence.createEntityManagerFactory("cachetest", props);
  • JPA 캐시의 경우 원칙적으로 <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 등의 shared-cache-mode 설정이 필요하지만, Hibernate Cache Annotaion과 Hint를 사용할 때는 상관없어보인다.

Entity Cache

@Entity
@Table(name = "books")
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "books")
public class Book implements Serializable {
....
}

Query Cache

  • Query Cache는 기본적으로 region을 지정하지 않으면 org.hibernate.cache.internal.StandardQueryCache region에 캐시 결과를 저장한다.
  • setHint를 통해 캐시하도록 지정
    TypedQuery<Book> query = em.createNamedQuery("Book.byEdition", Book.class);
    query.setParameter("edition", 3);
     
    query.setHint("org.hibernate.cacheable", true);
    query.setHint("org.hibernate.cacheRegion", "book-by-edition"); // region 지정
  • NamedQuery에 지정
    @Entity
    @Table(name = "books")
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "books")
    @NamedQuery(name = "Book.byEdition",
            query = "from Book where edition=:edition",
            hints = {
                    @QueryHint(name = "org.hibernate.cacheable", value = "true"),
                    @QueryHint(name = "org.hibernate.cacheRegion", value = "book-by-edition")
            }
    )
    public class Book implements Serializable {
    ....
    }

기타 정리

  • Hibernate 기준 정리

Entity

  • Entity는 update 쿼리 실행시 region의 expire가 발생한다.
  • query는 명시적 expire는 없고, entity가 수정될 경우 해당 entity의 update time stamp를 기반으로 쿼리를 다시 날릴지 아니면 캐시된 데이터를 사용할지 결정한다.

Query(JPQL, Critera 등)

  • query는 region을 지정하지 않으면 org.hibernate.cache.internal.StandardQueryCache region을 사용한다.
  • query는 org.hibernate.cache.spi.UpdateTimestampsCache region을 통해 특정 Entity의 timestamp를 저장한다.
  • UpdateTimestampCache에 의해 query의 자동 expire가 이루어 지므로 굳이 Query에 대한 region을 따로 지정하지 않아도 된다.
java/jpa/cache.1402157203.txt.gz · 마지막으로 수정됨: 2014/06/08 01:06 저자 kwon37xi