2016-01-21 63 views
2

在我的經驗中,我通常使用的共享緩存設置:二級緩存 - 爲什麼不緩存所有實體?

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 

我的過程是後來想想這不是預期的實體經常改變和那些會從緩存,在性能方面受益,標記爲@Cacheable。我使用選擇性實體緩存的做法是一個學習慣例,但我不完全理解這種方法。

爲什麼不緩存所有實體?什麼時候可以緩存所有實體成爲不利因素?我怎樣才能更好地評估這個做出更有教育的決定?

+1

如果某個實體經常被外部進程改變,該怎麼辦?可能不想緩存它(因爲那樣你就不得不繼續刷新) –

回答

3

一些原因不緩存的實體:

  1. 當實體頻繁改變(所以你最終會無效/在緩存中鎖定它們,並重新讀取它們無論如何,但你付出額外的成本的緩存維護不低,因爲緩存寫入操作會頻繁發生)。
  2. 如果有大量的實體實例要緩存,並且在給定時間段內沒有任何實例實例被更頻繁地使用。然後,基本上將實例放入緩存中並在之後不久將其逐出,以騰出空間放置新的實例,而無需頻繁讀取緩存實例以使緩存維護成本得到回報。
  3. 如果實體可以在沒有Hibernate意識到的情況下進行更改(例如從外部應用程序或直接JDBC)。
0

如果您使用的Ehcache爲您提供

<property key="hibernate.cache.use_second_level_cache">true</property> 
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property> 

然後,你可以配置緩存通過設置ehcache.xml中按要求驅逐最少使用的實體,以限制其使用的資源。

這裏http://howtodoinjava.com/2013/07/04/hibernate-ehcache-configuration-tutorial/

好文章一般而言,我能緩存一切,只是限制了緩存的大小。

希望這會有所幫助。

0

爲什麼不緩存所有實體?什麼時候可以緩存所有實體變成 損害?我怎樣才能更好地衡量這一點,做出更有教育的 決定?

一般而言,對於從緩存中受益的應用程序,應該以讀取爲主。這意味着每個寫入/更新有多個讀取。如果情況並非如此,比如在寫大部分或只寫(認爲來自溫度計的採樣數據),則不存在這樣的好處,因爲從閱讀難以從存儲器讀取數據而產生的節省不會產生。

爲了做出明智的決定,您可以緩存所有內容,然後觀看緩存的命中率。如果它很高(+ 70%),那麼你在正確的軌道上。