2011-03-11 44 views
9

我正在使用hibernate的spring項目,並期待使用ehcache實現二級緩存。我看到了許多方法是:Spring:hibernate + ehcache

  1. spring-modules-cache其介紹@Cacheable註釋

  2. ehcache-spring-annotations一個工具集,旨在成爲spring-modules-cache的繼任者。

  3. Hibernate cache很好地集成到休眠本身以使用例如@Cache註釋執行高速緩存。

  4. Programmatic cache使用代理。基於註解的配置很快就會變得有限或複雜(例如,註釋嵌套幾個級別)

我個人不認爲spring-modules-cache是不夠徹底,所以我可能會傾向於考慮更積極開發ehcache-spring-annotations。儘管看起來是最完整的實現(例如,讀取和寫入緩存等)。

什麼會激發哪個工具集使用?請分享你的緩存體驗...

回答

9

我們的項目採用選項3.我們應用註釋org.hibernate.annotations.Cache到我們緩存在Ehcache,使用ehcache.xml配置的Ehcache,並啓用和配置Hibernate second-level cachehibernate.cfg.xml實體:

<!-- Enable the second-level cache --> 
    <property name="hibernate.cache.provider_class"> 
     net.sf.ehcache.hibernate.EhCacheProvider 
    </property> 
    <property name="hibernate.cache.region.factory_class"> 
     net.sf.ehcache.hibernate.EhCacheRegionFactory 
    </property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.use_structured_entries">true</property>  
    <property name="hibernate.cache.generate_statistics">true</property> 

對於大多數實體,我們使用緩存併發策略CacheConcurrencyStrategy.TRANSACTIONAL

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 

我們Maven項目使用Hibernate 3.3.2GA和的Ehcache 2.2.0:

<dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache-core</artifactId> 
     <version>2.2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.2.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
     <exclusions> 
      <exclusion> 
       <groupId>net.sf.ehcache</groupId> 
       <artifactId>ehcache</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.2.1.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>ejb3-persistence</artifactId> 
     <version>3.3.2.Beta1</version> 
    </dependency> 
+1

很酷,你覺得怎麼樣,滿意?在嘗試了選項1和2後,我感覺它們仍然非常有限,並且根本不像我所希望的那麼簡潔。 – 2011-03-11 18:54:26

+0

直到我們在集羣中啓用同步RMI緩存複製之前,我們配置Hibernate和Ehcache的經驗是相對無痛的。啓用時,Hibernate開始拋出奇怪的異常。爲了解決這些異常,我們啓用了'hibernate.cache.use_structured_entries'。 Hibernate的後續版本可能沒有這個問題,但是當我們試圖解決這個問題時,我們的環境與Hibernate 3.5.6不兼容。 – 2011-03-11 19:13:03

+1

我在http://stackoverflow.com/questions/3631349/how-do-i-cure-the-cause-of-hibernate-exception-illegalargumentexception-ccurred上記錄了這種體驗。 – 2011-03-11 19:24:38