【问题标题】:How I can disable the second-level cache of some certain entities in Hibernate without changing annotations如何在不更改注释的情况下禁用 Hibernate 中某些实体的二级缓存
【发布时间】:2010-10-30 08:48:06
【问题描述】:

由于某些业务原因,我在我的应用程序中使用 Hibernate 二级缓存我无法再更改实体注释

在我的项目中,除了从 Hibernate 更改数据库之外,还存在其他不通过 Hibernate 的原生 SQL。因此,从本地 SQL 更新数据库后,Hibernate 二级缓存数据可能会过时。这就是为什么我希望为某些实体禁用二级缓存(以编程方式或除更改注释之外的其他方式)。

提前致谢!

【问题讨论】:

    标签: java hibernate annotations second-level-cache


    【解决方案1】:

    警告: 正如 Jens Schauder 所指出的,无法通过设置 maxElementsInMemory="0" 将 Ehcache 配置为在内存中存储 0 个元素,因为它实际上会产生相反的效果 - 为缓存设置无限大小。 Hibernate Caching 页面上未提及此行为,但在 Cache Configuration 页面上进行了记录。

    我已快速查看文档,但尚未找到替代方法。我无法自己删除此答案。 :-(

    我原来的建议:

    您可以将二级缓存的实现提供程序配置为缩短 TTL 时间和/或存储 0 个特定实体类型的条目。

    例如如果你使用的是 Ehcache,你可以在 ehcache.xml 中配置它:*

    <cache
    name="com.problematic.cache.EntityName"
    maxElementsInMemory="0" <<== this should effectively disable caching for EntityName
    overflowToDisk="false" <<== Do not overflow any entries to disk
    />
    

    请参阅 Ehcache 文档中的 Hibernate Caching

    【讨论】:

    • 谢谢 Matej,我想这正是我想要的答案!我还有一个问题,我的 ehcache.xml 放在我的可运行项目的类路径中,而实体类放在另一个实体项目中。似乎 Hibernate 只从我的 ehcache.xml 中读取默认缓存设置。即: Hibernate 不会读取我在 ehcache.xml 中的其他实体缓存设置。跨度>
    • 我认为在 , name 属性设置不正确,因此 Hibernate 无法使用读取此设置并使用默认设置。 name属性应该写什么?
    • Hibernate 通过其实体名称识别对象的缓存。默认情况下,类名用作实体名,但可以在 Hibernate 映射文件(或注释)中更改。如果您没有更改 Hibernate 映射中的实体名称,您应该简单地使用完全限定的类名称。否则使用在 Hibernate 映射中明确指定的(符号)实体名称。
    • 谢谢你,你说得对。我认为 ehcache.xml 中的 defaultCache 元素也可用于所有 QueryCache,如果我不设置 standardQueryCache 元素的话。所以我是否将 的 maxElementsInMemory 设置为“0”并不重要,因为所有 QueryCache 都在使用 defaultCache 区域。您是否知道我如何禁用 QueryCache 中某些特定实体的二级缓存(这意味着在实体级别禁用 QueryCache)?
    • 根据文档将 maxElementsInMemory 设置为 0 解释为无限制,因此它实际上会产生与您想要的相反的效果。我能提出的最佳建议是将其设置为 1 并设置为真正的短过期时间(也是 1)。请注意,过期时间为 0 也被解释为从不。
    【解决方案2】:

    在 Terracotta 3.1 及更高版本中,您可以使用 Terracotta 开发者控制台在配置(静态)和运行时基于每个区域启用/禁用 Hibernate 二级缓存。

    您还可以针对集群或集群范围内的各个节点实时监控缓存和休眠的统计信息。

    Terracotta 是开源的。更多详情,请查看Terracotta for Hibernate

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2019-05-13
      相关资源
      最近更新 更多