如何在不改变注释的情况下禁用Hibernate中某些特定实体的二级缓存

6
我正在使用Hibernate二级缓存,由于某些业务原因,我不能再更改实体注释
在我的项目中,除了从Hibernate更改数据库外,还存在其他未经Hibernate处理的本地SQL。因此,在从本地SQL更新数据库后,Hibernate二级缓存数据可能会过时。这就是为什么我想要以编程方式或其他方式禁用某些实体的二级缓存
提前致谢!
2个回答

7

警告:正如Jens Schauder所指出的那样,通过设置maxElementsInMemory="0"来配置Ehcache在内存中不存储任何元素是不可能的,因为这实际上会导致相反的效果-为缓存设置无限大小。这种行为在Hibernate缓存页面上没有提到,但在缓存配置页面上有记录。

我已经快速查阅了文档,但尚未找到替代方案。很遗憾,我无法自己删除这个答案。 :-(

我的原始建议:

您可以将第二级缓存的实现提供程序配置为短的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缓存


谢谢Matej,我认为这正是我想要的答案! 我有另一个问题,我的ehcache.xml放置在可运行项目的类路径中,而实体类则放置在另一个实体项目中。 似乎Hibernate只从我的ehcache.xml中读取默认缓存设置,即: <defaultCache maxElementsInMemory="0" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" /> Hibernate不读取我在ehcache.xml中的其他实体缓存设置。 - Kewei Shang
我认为在以下代码中: <cache name="business.entity.car" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="1800" timeToLiveSeconds="100000" overflowToDisk="false" /> ,name属性没有正确设置,因此Hibernate无法读取此设置并使用默认设置。 那么我应该在name属性中写什么呢? - Kewei Shang
Hibernate通过实体名称来识别对象的缓存。默认情况下,类名用作实体名称,但可以在Hibernate映射文件(或注释)中进行更改。如果您没有在Hibernate映射中更改实体名称,则应该简单地使用完全限定的类名。否则,请使用Hibernate映射中明确指定的(符号)实体名称。 - Matej
谢谢,你说得完全正确。我认为如果我不设置standardQueryCache元素,ehcache.xml中的defaultCache元素也用于所有QueryCaches。因此,将<cache name="business.entity.car"...>的maxElementsInMemory设置为“0”并不重要,因为所有QueryCache都使用defaultCache区域。你知道怎么样才能在QueryCache中禁用某些特定实体的二级缓存吗(这意味着在实体级别禁用QueryCache)? - Kewei Shang
根据文档,将maxElementsInMemory设置为0会被解释为无限制,所以它实际上会产生与您想要的相反的效果。我能提供的最佳建议是将其设置为1,并设置真正短的过期时间(也为1)。请注意,过期时间的0也被解释为从未过期。 - Jens Schauder
好的,Jens。我打算删除我的答案,因为它是不正确的,误导性的,而且我不知道替代方法。 - Matej

1
在Terracotta 3.1及以上版本中,您可以按区域启用/禁用Hibernate第二级缓存,无论是在配置(静态)还是在运行时,都可以使用Terracotta开发人员控制台。
您还可以实时监视有关缓存和Hibernate的统计信息,适用于集群中的单个节点或整个集群。
Terracotta是开源的。有关更多详细信息,请查看Terracotta for Hibernate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接