Java Hibernate查询缓存类型
在从数据库检索对象的Spring MVC应用程序中,我需要使用以下条件缓存查询: 1) 缓存中应该有五个持久化的对象,在应用程序生命周期中访问数据库时,不应该在数据库中进行选择 2) 每个查询应缓存2秒钟 我试图用以下方法来解决这个问题: 声明以下ehcache.xmlJava Hibernate查询缓存类型,java,hibernate,caching,spring-mvc,ehcache,Java,Hibernate,Caching,Spring Mvc,Ehcache,在从数据库检索对象的Spring MVC应用程序中,我需要使用以下条件缓存查询: 1) 缓存中应该有五个持久化的对象,在应用程序生命周期中访问数据库时,不应该在数据库中进行选择 2) 每个查询应缓存2秒钟 我试图用以下方法来解决这个问题: 声明以下ehcache.xml <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000"
<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>
第二个用于检索所有其他场景:
@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?他们是同一课程的一部分吗?如果是这样,那么在某些版本的Hibernate中存在一个bug,如果您仍在创建查询缓存的同一会话中,该bug会阻止查询缓存工作。另外,尝试启用一些日志记录(org.hibernate.cache的调试级别,IIRC)。它确切地说明了发生了什么 您还可以看到这两个JIRAs(它们是同一个问题,只是在不同的JIRAs中),以了解如何正确地执行它。它还可以显示您的Hibernate版本是否受到该错误的影响
您使用的是哪个版本的Hibernate?他们是同一课程的一部分吗?如果是这样,那么在某些版本的Hibernate中存在一个bug,如果您仍在创建查询缓存的同一会话中,该bug会阻止查询缓存工作。另外,尝试启用一些日志记录(org.hibernate.cache的调试级别,IIRC)。它确切地说明了发生了什么 您还可以看到这两个JIRAs(它们是同一个问题,只是在不同的JIRAs中),以了解如何正确地执行它。它还可以显示您的Hibernate版本是否受到该错误的影响
在黑暗中拍摄,但hibernate确实有优化功能,在您反复提交同一字符串时,不会反复进行相同的查询。如果您向其中一个添加了一些无用的东西,如“and 1=1”,这样它就不再匹配了,它会开始工作吗?在黑暗中拍摄,但hibernate确实进行了优化,当您反复提交相同的字符串时,不会一直重复执行相同的查询。如果您向其中一个添加一些无用的内容,如“and 1=1”,使其不再匹配,那么它是否开始工作?
<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;
}