2011-03-19 343 views
1

我有一些問題讓hibernate二級緩存工作緩存域對象。根據ehcache documentation,將緩存添加到我現有的工作應用程序中應該不會太複雜。春季休眠ehcache設置

我有以下設置(只有相關的片段進行了概述):

@Entity 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE 
public void Entity { 
    // ... 
} 

的Ehcache-entity.xml

<cache name="com.company.Entity" eternal="false" 
    maxElementsInMemory="10000" overflowToDisk="true" diskPersistent="false" 
    timeToIdleSeconds="0" timeToLiveSeconds="300" 
    memoryStoreEvictionPolicy="LRU" /> 

的applicationContext.xml

<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="ds" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.company.Entity</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="net.sf.ehcache.configurationResourceName">/ehcache-entity.xml</prop> 
      <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop> 
      .... 
    </property> 
</bean> 

Maven依賴

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-hibernate3</artifactId> 
     <version>2.0.8</version> 
     <exclusions> 
      <exclusion> 
       <artifactId>hibernate</artifactId> 
       <groupId>org.hibernate</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache-core</artifactId> 
     <version>2.3.2</version> 
    </dependency> 

測試類是用來使緩存統計信息:

Cache cache = cacheManager.getCache("com.company.Entity"); 
    cache.setStatisticsAccuracy(Statistics.STATISTICS_ACCURACY_GUARANTEED); 
    cache.setStatisticsEnabled(true); 
    // store, read etc ... 
    cache.getStatistics().getMemoryStoreObjectCount(); // returns 0 

無操作似乎觸發任何緩存的變化。我錯過了什麼?目前我在DAO中使用HibernateTemplate,這可能會有一些影響。

[編輯]

當設置爲DEBUG唯一的Ehcache日誌輸出是:

SettingsFactory: Cache region factory : net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory 
+0

是否日誌告訴你什麼時候加載XML ecache? – heldt 2011-03-19 20:40:38

+0

@heldt,我已更新我的帖子,以包含ehcache警告 – 2011-03-19 20:44:23

回答

1

有,我已經確定了幾個原因:

  1. 正確Maven依賴:

    <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-core</artifactId> 
        <version>3.6.3.Final</version> 
    </dependency> 
    
    <dependency> 
        <groupId>net.sf.ehcache</groupId> 
        <artifactId>ehcache-core</artifactId> 
        <version>2.4.1</version> 
    </dependency> 
    
  2. javax.persistence向我的實體添加了@Cacheable註釋。

  3. 從hibernate讀取日誌而不是ehcache。

    getSessionFactory().getStatistics().logSummary();

  4. 並非所有休眠操作似乎影響緩存。這我需要進一步閱讀。

1

你需要手動告訴Hibernate使用的EHCache供應商?我從來不確定這是否是必需的,但Hibernate確實支持許多緩存提供程序,所以我懷疑可能需要明確告訴Hibernate需要哪一個。嘗試添加此屬性的applicationContext.xml

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
+2

感謝您的回覆,根據[文檔](http://ehcache.org/documentation/hibernate.html#Hibernate_3.3_and_higher),因爲休眠3.3財產不應該是必要的。 – 2011-03-20 09:59:47

0

通過看你的配置,這一切似乎罰款AFAICT。唯一值得注意的是,當使用HibernateTemplate時,如果您計劃使用查詢緩存,則必須明確設置CacheQueries(true)......除非您真的需要http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html#setCacheQueries(boolean

你試過Hibernate統計而不是Ehcache的嗎?你在那裏得到緩存未命中嗎? (原因我問的是要確保你使用相同的CacheManager如Hibernate並不)...

+0

我不打算使用查詢緩存,因此它被禁用,但感謝您的注意。我也在重構hibernatetemplate的過程中,所以我會回來的時候完成:) – 2011-03-21 16:20:46

0

您可以參考以下配置

<prop key="hibernate.cache.use_query_cache">true</prop>