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

Second Level Cache - Why not cache all entities?

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

<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/

一般来说我会缓存一切,只是限制缓存的大小。

希望对您有所帮助。

不缓存实体的一些原因:

  1. 当实体频繁更改时(因此您最终会 invalidating/locking 它们在缓存中并且无论如何都会 re-reading 它们,但是您需要支付额外的缓存维护成本,这自缓存以来并不低写操作会很频繁)。
  2. 如果有大量实体实例需要缓存,并且在给定时间段内,其中 none 个实例的使用频率高于其他实例。然后,您基本上会将实例放入缓存中,并在不久之后驱逐它们以为新实例腾出空间,而无需足够频繁地读取缓存实例以支付缓存维护成本。
  3. 如果可以在 Hibernate 不知情的情况下更改实体(例如从外部应用程序或直接 JDBC)。

Why not cache all entities? When can caching all entities become a detriment? How can I better gauge this to make a more educated decision?

一般来说,要让应用程序受益于缓存数据应该 read-mostly。这意味着每个 write/update 有多个读取。如果不是这种情况,如 write-mostly 或 write-only(想想从温度计中采样数据),那么好处就不存在了,因为通过努力读取从内存中获取数据不会产生任何节省。

要做出明智的决定,您可以缓存所有内容,然后观察缓存的 hit/miss 比率。如果它很高 (+70%),那么您就在正确的轨道上。