二级缓存 - 为什么不缓存所有实体?
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/
一般来说我会缓存一切,只是限制缓存的大小。
希望对您有所帮助。
不缓存实体的一些原因:
- 当实体频繁更改时(因此您最终会 invalidating/locking 它们在缓存中并且无论如何都会 re-reading 它们,但是您需要支付额外的缓存维护成本,这自缓存以来并不低写操作会很频繁)。
- 如果有大量实体实例需要缓存,并且在给定时间段内,其中 none 个实例的使用频率高于其他实例。然后,您基本上会将实例放入缓存中,并在不久之后驱逐它们以为新实例腾出空间,而无需足够频繁地读取缓存实例以支付缓存维护成本。
- 如果可以在 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%),那么您就在正确的轨道上。
根据我的经验,我通常使用共享缓存设置:
<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/
一般来说我会缓存一切,只是限制缓存的大小。
希望对您有所帮助。
不缓存实体的一些原因:
- 当实体频繁更改时(因此您最终会 invalidating/locking 它们在缓存中并且无论如何都会 re-reading 它们,但是您需要支付额外的缓存维护成本,这自缓存以来并不低写操作会很频繁)。
- 如果有大量实体实例需要缓存,并且在给定时间段内,其中 none 个实例的使用频率高于其他实例。然后,您基本上会将实例放入缓存中,并在不久之后驱逐它们以为新实例腾出空间,而无需足够频繁地读取缓存实例以支付缓存维护成本。
- 如果可以在 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%),那么您就在正确的轨道上。