2016-01-13 48 views
1

項目X包含以下幾部分:在Spring /休眠中正確使用高速緩存

a。 Spring數據存儲庫具有不同的方法,如:

@Cacheable(value = "xobjects", unless = "#result == null") 
XObject findByParamA(String paramA); 

@Cacheable(value = "xobjects", unless = "#result == null") 
XObject findByParamB(String paramB); 

@CacheEvict("xobjects") 
<E extends XObject> E save(E entity); 

b。 Hibernate也使用「xobjects」緩存。

問題#1 既然有加的對象的2種方式緩存時相同的對象出現2次,也可能是這種情況。如何更好地解決這個問題?例如使用結果對象中的鍵。喜歡的東西:

鍵=「#result.id」

問題#2 我不想從緩存中驅逐所有對象時,「保存」方法被調用,但我不確保當前的實施將起作用。 「保存」方法有xobject作爲輸入,所以CacheEvict將它用作驅逐的關鍵,沒有我期望會發生的事情。在這裏,我相信能夠像上面一樣使用魔術鍵的相同方法會很好。

更新#1其實我覺得我的建議能正常工作,這裏是一個樣本 - https://github.com/zhangkaitao/spring4-showcase/blob/master/spring-cache/src/main/java/com/sishuok/spring/service/UserService2.java 但我需要先進行測試。稍後將分享結果。

+2

您確定要爲此使用Spring Cache抽象或使用您的ORM提供程序的第二級緩存,因爲它會自動爲您執行這些操作。 –

+0

我在想這件事,那很好。我已經用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)標記了XObject並啓用了「hibernate.cache.use_second_level_cache」。但是上面的方法沒有被緩存。查詢緩存會有幫助嗎? – ICE

回答

1

您的方法將不起作用或將很難維護。除了需要手動維護緩存之外,如果希望管理它們,則需要將實體實例合併回每個新的Hibernate會話(持久性上下文),因爲從您自己的緩存中返回的實體將始終被分離。

最好的方法是使用Hibernate二級緩存,它將自動爲您執行緩存條目生命週期作業。