在我的经验中,我通常使用的共享缓存设置:二级缓存 - 为什么不缓存所有实体?
<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%),那么你在正确的轨道上。
如果某个实体经常被外部进程改变,该怎么办?可能不想缓存它(因为那样你就不得不继续刷新) –