gpt4 book ai didi

java - Hibernate 查询缓存类型

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:16 24 4
gpt4 key购买 nike

在从数据库检索对象的 Spring MVC 应用程序中,我需要使用以下条件缓存查询:

1) 将有五个对象应持久保存在缓存中,并且在应用程序生命周期内访问它时不应在数据库中进行选择。

2) 每个查询应缓存 2 秒。

我正在尝试通过以下方式解决它:

声明以下ehcache.xml

<ehcache>  
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"/>
<cache name="hibernate.test.org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"/>
<cache name="hibernate.test.org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"/>
<cache name="com.doolloop.objects.Scene"
maxElementsInMemory="300"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
/>
<cache name="query.homePageScene"
maxElementsInMemory="5"
eternal="true"
overflowToDisk="true"/>
</ehcache>

在我的 servlet xml 中,我启用了以下功能:

<prop key="hibernate.cache.use_second_level_cache">true</prop> 
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>

我的映射如下所示:

 <class
name="com.doolloop.objects.Scene" table="scene"
>
<cache usage="read-only" region="query.homePageScene" />
<id name="id"
column="Id"
type="java.lang.Long" unsaved-value="null">
<generator class="sequence">
<param name="sequence">doolloop2.sceneseq</param>
</generator>
</id>

现在介绍方法:

一个用于检索五个持久查询对象之一:

@Transactional(readOnly = true)
public Scene getHomePageScene(Long id) {
Session session = this.sessionFactory.getCurrentSession();
Query q = session.createQuery("select scene from com.doolloop.objects.Scene scene where scene.id=:id");
q.setLong("id",id);
q.setCacheable(true);
q.setCacheRegion("query.homePageScene");
Scene scene = (Scene)q.uniqueResult();
return scene;
}

第二个用于检索所有其他场景:

    @Transactional(readOnly = true)
public Scene getScene(Long id) {
Session session = this.sessionFactory.getCurrentSession();
Query q = session.createQuery("select scene from com.doolloop.objects.Scene scene where scene.id=:id");
q.setLong("id",id);
Scene scene = (Scene)q.uniqueResult();
return scene;
}

我的问题是,无论执行哪种方法,我的所有查询始终缓存在 query.homePageScene 区域中。

我做错了什么?

最佳答案

您使用的是哪个版本的 Hibernate?它们是同一 session 的一部分吗?如果是这样,则 Hibernate 的某些版本中存在一个错误,如果您仍在创建查询缓存的同一 session 中,该错误会阻止查询缓存工作。另外,尝试启用一些日志记录(org.hibernate.cache 的 DEBUG 级别、IIRC)。它确切地说明了发生了什么。

您还可以查看这两个 JIRA(它们是同一个问题,只是在不同的 JIRA 中)以了解如何正确执行此操作。它还可以向您显示您的 Hibernate 版本是否受到该错误的影响。

https://issues.jboss.org/browse/JBPAPP-4224

http://opensource.atlassian.com/projects/hibernate/browse/HHH-5210

关于java - Hibernate 查询缓存类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4476073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com