사용자 도구

사이트 도구


java:jpa:cache

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:jpa:cache [2014/06/08 01:07]
kwon37xi
java:jpa:cache [2015/03/17 14:00]
kwon37xi
줄 4: 줄 4:
   * 아래 나오는 Property Key의 대부분은 [[https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/cfg/Environment.html|Environment]] 클래스에 상수로 정의 돼 있다.   * 아래 나오는 Property Key의 대부분은 [[https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/cfg/Environment.html|Environment]] 클래스에 상수로 정의 돼 있다.
  
-===== Hibernate Cache 활성화 ===== +===== Evict All ===== 
-  * [[java:hibernate:cache|Hibernate Cache]] 도 함께 참조 +현재 Hibernate 구현체(4.3)은 JPA의 Cache.evictAll() 호출시에 모든 Region을 evict하지 않고 오로지 Entity 관련 region에 대해서만 evict를 수행한다.
-<code sh> +
-Map<String,Object> props = new HashMap<String,Object>();+
  
-// hibernate.cache.use_second_level_cache +전체 리젼을 다 evict하려면 Hibernate의 ''SessionFactory''의 ''Cache'' 구현체로 수행해야 한다. 
-props.put(Environment.USE_SECOND_LEVEL_CACHE, true); +관련 구현은 [[https://github.com/hibernate/hibernate-orm/blob/master/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/EntityManagerFactoryImpl.java 
 +|EntityManagerFactoryImpl.java]]에 있다.
  
-// 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); 
-</code> 
- 
-  * JPA 캐시의 경우 원칙적으로 ''<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>'' 등의 ''shared-cache-mode'' 설정이 필요하지만, Hibernate Cache Annotaion과 Hint를 사용할 때는 상관없어보인다. 
-===== Entity Cache ===== 
-  * Entity는 update 쿼리 실행시 region의 expire가 발생한다. 
 <code java> <code java>
-@Entity +// JPA 2.0사용시 
-@Table(name = "books"+HibernateEntityManagerFactory hemf = (HibernateEntityManagerFactory)entityManagerFactory; 
-@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "books"+org.hibernate.Cache cache = hemf.getSessionFactory().getCache();
-public class Book implements Serializable { +
-.... +
-+
-</code> +
- +
- +
-===== Query Cache ===== +
-  * Query Cache는 기본적으로 region을 지정하지 않으면 ''org.hibernate.cache.internal.StandardQueryCache'' region에 캐시 결과를 저장한다. +
-  * query는 명시적 expire는 없고, entity가 수정될 경우 해당 entity의 update time stamp를 기반으로 쿼리를 다시 날릴지 아니면 캐시된 데이터를 사용할지 결정한다. +
-  * query는 ''org.hibernate.cache.spi.UpdateTimestampsCache'' region을 통해 특정 Entity의 timestamp를 저장한다. +
-  * UpdateTimestampCache에 의해 query의 자동 expire가 이루어 지므로 굳이 Query에 대한 region을 따로 지정하지 않아도 된다. +
-  * ''setHint''를 통해 캐시하도록 지정<code java> +
-TypedQuery<Book> query em.createNamedQuery("Book.byEdition", Book.class)+
-query.setParameter("edition", 3);+
  
-query.setHint("org.hibernate.cacheable", true); +// JPA 2.1 사용시 
-query.setHint("org.hibernate.cacheRegion", "book-by-edition"); // region 지정 +SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class
-</code>+org.hibernate.Cache cache = sessionFactory.getCache();
  
-  * ''NamedQuery에 지정''<code java> +// 전체 eviction 
-@Entity +cache.evictEntityRegions(); 
-@Table(name = "books"+cache.evictQueryRegions(); 
-@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "books"+cache.evictCollectionRegions();
-@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 { +
-.... +
-}+
 </code> </code>
  
java/jpa/cache.txt · 마지막으로 수정됨: 2015/10/17 12:07 저자 kwon37xi