![](/img/trans.png)
[英]Verification of Caching approach with EhCache, Spring and Hibernate
[英]Caching not working with Spring 3.0, Hibernate 3.6, and EhCache 2.6.6
我們正在嘗試使緩存在我們的應用程序中工作,並且很難使其真正起作用。 至少在應用程序的這一部分,我們沒有非常復雜的配置,所以它確實令人沮喪,我最終不得不讓自己屈服於StackOverflow社區。
首先,目前,我們只停留在Spring 3.0和Hibernate 3.6上,因此使用新的Spring 3.1 @Cacheable批注以及所有其他內容對我們來說不是一個選擇。
我已經將堆棧的版本放入主題中,並且所擁有的是該堆棧的非常典型的配置:
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>
然后,我將@Cache注釋添加到我的實體類中,如下所示:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "config")
public class Configuration extends AbstractHibernateEntity implements Serializable {
老實說,我以為我完成了。 是的,我如此輕松地配置了緩存! 您會看到它正在運行,隨着緩存聯機,日志中有很多消息。 那很棒!
只有事實證明,緩存已經聯機,並且沒有任何緩存。 我現在已經花了兩天時間,不知道為什么我的對象沒有被緩存。 我嘗試將<cache name="..."/>
到ehcache.xml中 ,在@Cache批注中指定區域,檢查緩存統計信息,等等。為net.sf添加了調試日志記錄。 ehcache和org.hibernate.cache軟件包。 我只是看不到是什么使它無法將對象保存到緩存並在那里訪問它們。
意識到我們的Web應用程序不是緩存后,我回到了依賴庫中,意識到它們也沒有緩存(我在單元測試中添加了緩存,以確保緩存不會破壞單元測試;它不會不是,但這也許只是因為它沒有緩存)。 因此,我一直在研究我們的一個較低級別的依賴項,以弄清楚如果我能弄清楚如何使其在該級別上工作,我可以將其提升到Web應用程序級別。 這是一個很棒的理論,除了我什至無法使其在較低的水平上起作用!
在我的日志中,我收到很多消息。 因此,這是net.sf.ehcache的調試輸出的示例 :
14:03:20,795 INFO net.sf.ehcache: 284 - CACHE HITS: 0
14:03:20,796 INFO net.sf.ehcache: 284 - IN-MEM HITS: 0
14:03:20,796 INFO net.sf.ehcache: 284 - CACHE MISS: 0
14:03:20,796 INFO net.sf.ehcache: 284 - IN-MEM MISS: 0
14:03:20,796 INFO net.sf.ehcache: 284 - EVICTIONS: 0
14:03:20,797 INFO net.sf.ehcache: 284 - MEM OBJ CT: 0
14:03:20,886 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231789056
14:03:20,890 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231805440
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986045441
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986045441
14:03:20,897 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231834112
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231838208
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986078209
14:03:20,899 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986078209
在org.hibernate.cache日志中,我得到了很多類似的東西:
14:47:26,077 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,081 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820751872
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820751872
14:47:26,089 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,091 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820792832
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820792832
14:47:26,125 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,130 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,131 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820952576
14:47:26,132 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820952576
我真的不知道從這里還能說什么。 完整的代碼既可以從https://bitbucket.org/rherrick/nrg_config上的 Bitbucket存儲庫(它是Mercurial,而不是git)中獲得,也可以從Dropbox中以https://dl.dropboxusercontent.com/u/42711610/的zip格式獲得。 nrg_config.zip 。 您應該能夠使用以下命令從Maven運行單元測試:
mvn clean install
如果有人可以幫助我弄清楚這里到底出了什么問題,我會欣喜若狂! 難道你不希望我欣喜若狂嗎? 我知道我會做:)
認真地說,在此問題上的任何幫助,在此先要多謝,之后再多謝。
據我了解,僅當您在Session
上調用load
get
, list
等時,才會使用對象的二級緩存。 我在您的代碼中看不到此類調用。
僅當您對Query
或Criteria
對象調用setCacheable
時,才使用查詢緩存。 再說一次,您永遠不會在代碼中調用該方法。
亞歷山大,
您走在正確的道路上,但這只是造成問題的少數幾個因素之一。 確實存在三個因素:
最后,這實際上很難診斷,主要是因為它不是一個單一的因素,而是由許多不同的因素共同造成的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.