二级缓存 - 为什么不缓存所有实体?

问题描述:

在我的经验中,我通常使用的共享缓存设置:二级缓存 - 为什么不缓存所有实体?

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

我的过程是后来想想这不是预期的实体经常改变和那些会从缓存,在性能方面受益,标记为@Cacheable。我使用选择性实体缓存的做法是一个学习惯例,但我不完全理解这种方法。

为什么不缓存所有实体?什么时候可以缓存所有实体成为不利因素?我怎样才能更好地评估这个做出更有教育的决定?

+1

如果某个实体经常被外部进程改变,该怎么办?可能不想缓存它(因为那样你就不得不继续刷新) –

一些原因不缓存的实体:

  1. 当实体频繁改变(所以你最终会无效/在缓存中锁定它们,并重新读取它们无论如何,但你付出额外的成本的缓存维护不低,因为缓存写入操作会频繁发生)。
  2. 如果有大量的实体实例要缓存,并且在给定时间段内没有任何实例实例被更频繁地使用。然后,基本上将实例放入缓存中并在之后不久将其逐出,以腾出空间放置新的实例,而无需频繁读取缓存实例以使缓存维护成本得到回报。
  3. 如果实体可以在没有Hibernate意识到的情况下进行更改(例如从外部应用程序或直接JDBC)。

如果您使用的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%),那么你在正确的轨道上。