繁体   English   中英

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

[英]Second Level Cache - Why not cache all entities?

根据我的经验,我通常使用共享缓存设置:

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

我的过程是考虑哪些实体不会经常更改,哪些实体将从缓存中获益,性能明智,并将其标记为@Cacheable 我使用选择性实体缓存的做法是一种学习惯例,但我并不完全理解这种方法。

为什么不缓存所有实体? 什么时候缓存所有实体会变得有害? 我怎样才能更好地衡量这一点,以做出更明智的决定?

一些不缓存实体的原因:

  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%),那么你就是在正确的轨道上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM