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

时间:2016-01-21 15:27:56

标签: hibernate jpa caching jpa-2.0 second-level-cache

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

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

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

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

3 个答案:

答案 0 :(得分:3)

不缓存实体的一些原因:

  1. 当实体经常更改时(因此您最终会将它们无效/锁定在缓存中并重新读取它们,但是您需要支付额外的缓存维护成本,因为缓存写入操作会很频繁)
  2. 如果有大量实体实例要缓存,并且在给定的时间段内没有比其他实体实例更频繁地使用它们。然后,您基本上会将实例放入缓存中,然后很快将它们逐出,以便为新的实例腾出空间,而无需经常读取缓存的实例,从而使缓存维护成本得到回报。
  3. 如果可以在没有Hibernate知道的情况下更改实体(例如,从外部应用程序或使用直接JDBC)。

答案 1 :(得分: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/

一般来说,我会缓存所有内容,只是限制缓存的大小。

希望这有帮助。

答案 2 :(得分:0)

  

为什么不缓存所有实体?什么时候可以缓存所有实体成为一个   损害?我怎样才能更好地衡量这一点,以使他们受到更多教育   决定?

一般来说,对于受益于缓存的应用程序,应该主要读取数据。这意味着每次写入/更新有多个读取。如果不是这种情况,如写入 - 大多数或只写(想想温度计的采样数据),那么好处就不存在了,因为没有通过难以从内存中获取数据而产生的保存。

要做出明智的决定,您可以缓存所有内容,然后查看缓存的命中/未命中率。如果它很高(+ 70%),那么你就走在了正确的轨道上。