2012-11-14 5 views
1

Spring 프레임 워크에서 Hibernate를 사용하고 있으며 CriteriaAPI를 통해 작성된 쿼리를 캐시하려고한다. 쿼리 캐시와 2 차 수준 캐시를 활성화했습니다. 또한 특정 쿼리에서 setCacheable을 true로 설정했습니다. 문제는 최대 절전 모드 세션 통계가 여러 번 실행중인 동일한 쿼리의 모든 데이터베이스를 조회한다는 것입니다. 여기 Hibernate Cache Always Misses

는 기준 여기
@Override 
public Collection<Article> findLatestArticle(int count) { 
    // TODO Auto-generated method stub 
    Criteria criteria = this.getSession() 
    .createCriteria(Article.class) 
    .setCacheable(true) 
    .setCacheRegion(CACHE_REGION) 
    .add(Restrictions.eq("isVisible", 1)) 
    //.createCriteria("Count") 
    //.add(Restrictions.eq("Count", count)) 
    .setFirstResult(0) 
    .setMaxResults(count); 

    return criteria.list(); 
} 

호출자 기능이 클래스

@Test 
public void t1(){ 
    List<Article> articleList = (List<Article>) articleDao.findLatestArticle(1); 

    //Article a = articleDao.findById(articlePk); 

    for(int i=0; i<19; i++) 
     articleDao.findLatestArticle(1); 

    Statistics stats = sessionFactory.getCurrentSession().getSessionFactory().getStatistics(); 

    //System.out.println("2nd Lvl Stats: " + stats.getSecondLevelCacheStatistics(CACHE_REGION)); 
    stats.logSummary(); 

    System.out.println("Empty: " + articleList.isEmpty()); 

    assertTrue(!articleList.isEmpty()); 
    //assertNotNull(a); 
} 

스프링 동면 콘텍스트 파일

<property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
      <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.cache.use_structured_entries">true</prop> 
      <prop key="net.sf.Ehcache.configurationResourceName">ehcache.xml</prop> 
     </props> 
    </property> 

으로 Ehcache 부 검색어와 함수의

<cache name="com.contento3.cms.article.model.Article" 
maxElementsInMemory="10000" 
eternal="false" 
timeToIdleSeconds="300" 
timeToLiveSeconds="60" 
overflowToDisk="true"/> 

로그인 발췌 :

2012-11-14 21:05:03,020 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled 
2012-11-14 21:05:03,020 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: enabled 
    2012-11-14 21:05:03,969 [main] INFO org.hibernate.cache.StandardQueryCache - starting query cache at region: com.contento3.cms.article.model.Article 
2012-11-14 21:05:03,998 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 10ms, rows: 1 
2012-11-14 21:05:04,010 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 1ms, rows: 1 
2012-11-14 21:05:04,019 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 8ms, rows: 1 
2012-11-14 21:05:04,022 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,024 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,026 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,033 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 7ms, rows: 1 
2012-11-14 21:05:04,035 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,038 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,041 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,050 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 3ms, rows: 1 
2012-11-14 21:05:04,059 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 9ms, rows: 1 
2012-11-14 21:05:04,062 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 3ms, rows: 1 
2012-11-14 21:05:04,067 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 4ms, rows: 1 
2012-11-14 21:05:04,074 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 5ms, rows: 1 
2012-11-14 21:05:04,077 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,079 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 1ms, rows: 1 
2012-11-14 21:05:04,081 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 1ms, rows: 1 
2012-11-14 21:05:04,083 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,085 [main] INFO org.hibernate.stat.Statistics - HQL: from Article as a, time: 2ms, rows: 1 
2012-11-14 21:05:04,085 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - Logging statistics.... 
2012-11-14 21:05:04,085 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - start time: 1352909103053 
2012-11-14 21:05:04,085 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions opened: 1 
2012-11-14 21:05:04,085 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions closed: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - transactions: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - successful transactions: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - optimistic lock failures: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - flushes: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - connections obtained: 1 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements prepared: 21 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements closed: 21 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache puts: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache hits: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache misses: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities loaded: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities updated: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities inserted: 1 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities deleted: 0 
2012-11-14 21:05:04,086 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities fetched (minimize this): 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections loaded: 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections updated: 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections removed: 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections recreated: 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections fetched (minimize this): 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - queries executed to database: 20 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache puts: 20 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache hits: 0 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache misses: 20 
2012-11-14 21:05:04,087 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - max query time: 10ms 

나는 봄과 최대 절전 모드로 비교적 새로운 해요. 나는이 문제에 관한 적어도 12 개의 기사를 읽고 모든 것을 할 수 있었다. 또한 createQuery 메서드를 사용하여 비슷한 쿼리를 작성 했으므로 결과는 동일합니다. 어떤 도움을 주시면 감사하겠습니다.

+0

가 제 객체가 @Cache 주석으로 표시되어 캐싱 전략이 @Cacheable @cache에 대한 주석을 사용하려고? – chrislhardin

+0

@chrislhardin : 네, 이렇게 추가했습니다. @Entity @Cache (usage = CacheConcurrencyStrategy.READ_WRITE) @Table (name = "ARTICLE") public class Article은 Serializable {....'을 구현합니다. –

답변