Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不更改注释的情况下禁用Hibernate中某些实体的二级缓存_Java_Hibernate_Annotations_Second Level Cache - Fatal编程技术网

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

Java 如何在不更改注释的情况下禁用Hibernate中某些实体的二级缓存,java,hibernate,annotations,second-level-cache,Java,Hibernate,Annotations,Second Level Cache,我在应用程序中使用Hibernate二级缓存,出于某些业务原因,我无法再更改实体注释 在我的项目中,除了从Hibernate更改数据库外,还有其他不经过Hibernate的原生SQL。因此,从本机SQL更新数据库后,Hibernate二级缓存数据可能会过时。这就是为什么我希望禁用某些实体的二级缓存(以编程方式或更改注释以外的其他方式)。 提前谢谢 警告:正如Jens Schauder所指出的,通过设置maxElementsInMemory=“0”无法将Ehcache配置为在内存中存储0个元素,因

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

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


提前谢谢

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

我已经很快地查看了文档,还没有找到替代方法。本人无法删除此答案:-(

我最初的建议是:

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

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

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


Terracotta是开源的。有关更多详细信息,请查看。

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