首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二级缓存-为什么不缓存所有实体?

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

Stack Overflow用户
提问于 2016-01-21 15:27:55
回答 3查看 930关注 0票数 4

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

代码语言:javascript
复制
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

然后,我的流程是考虑哪些实体不需要经常更改,以及那些从缓存中获益的实体,从性能上考虑,并将这些实体标记为@Cacheable。我使用选择性实体缓存的实践是一种学习习惯,但我并不完全理解这种方法。

为什么不缓存所有实体?什么时候缓存所有实体会成为一种损害?我怎样才能更好地判断这一点,从而做出更有教养的决定呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-21 16:14:04

不缓存实体的一些原因如下:

  1. 当实体频繁更改时(因此您最终会在缓存中使它们失效/锁定并重新读取它们,但是您需要支付额外的缓存维护成本,这并不低,因为缓存写入操作将非常频繁)。
  2. 如果有大量实体实例需要缓存,并且在给定时间内没有一个实例比其他实例使用得更频繁。然后,您基本上会将实例放入缓存中,并在之后不久将它们清除,以便为新实例腾出空间,而不需要频繁地读取缓存的实例,从而使缓存维护成本得到补偿。
  3. 如果实体可以在没有Hibernate意识到的情况下进行更改(例如,来自外部应用程序或直接JDBC )。
票数 4
EN

Stack Overflow用户

发布于 2016-01-21 15:50:52

如果您使用ehcache作为提供程序

代码语言:javascript
复制
<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/

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

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2016-01-24 08:53:47

为什么不缓存所有实体?什么时候缓存所有实体会成为一种损害?我怎样才能更好地判断这一点,从而做出更有教养的决定呢?

一般来说,应用程序要想从缓存中获益,就应该读取数据--主要是读取数据。这意味着每次写入/更新都有多个读取。如果不是这种情况,比如只写或只写(比如从温度计中取样数据),那么好处就不存在了,因为难以从内存中读取数据并不能节省开支。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34927713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档