在我的經驗中,我通常使用的共享緩存設置:二級緩存 - 爲什麼不緩存所有實體?
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
我的過程是後來想想這不是預期的實體經常改變和那些會從緩存,在性能方面受益,標記爲@Cacheable
。我使用選擇性實體緩存的做法是一個學習慣例,但我不完全理解這種方法。
爲什麼不緩存所有實體?什麼時候可以緩存所有實體成爲不利因素?我怎樣才能更好地評估這個做出更有教育的決定?
在我的經驗中,我通常使用的共享緩存設置:二級緩存 - 爲什麼不緩存所有實體?
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
我的過程是後來想想這不是預期的實體經常改變和那些會從緩存,在性能方面受益,標記爲@Cacheable
。我使用選擇性實體緩存的做法是一個學習慣例,但我不完全理解這種方法。
爲什麼不緩存所有實體?什麼時候可以緩存所有實體成爲不利因素?我怎樣才能更好地評估這個做出更有教育的決定?
一些原因不緩存的實體:
如果您使用的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/
好文章一般而言,我能緩存一切,只是限制了緩存的大小。
希望這會有所幫助。
爲什麼不緩存所有實體?什麼時候可以緩存所有實體變成 損害?我怎樣才能更好地衡量這一點,做出更有教育的 決定?
一般而言,對於從緩存中受益的應用程序,應該以讀取爲主。這意味着每個寫入/更新有多個讀取。如果情況並非如此,比如在寫大部分或只寫(認爲來自溫度計的採樣數據),則不存在這樣的好處,因爲從閱讀難以從存儲器讀取數據而產生的節省不會產生。
爲了做出明智的決定,您可以緩存所有內容,然後觀看緩存的命中率。如果它很高(+ 70%),那麼你在正確的軌道上。
如果某個實體經常被外部進程改變,該怎麼辦?可能不想緩存它(因爲那樣你就不得不繼續刷新) –