Java Hibernate查询缓存类型

Java 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"

在从数据库检索对象的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>
第二个用于检索所有其他场景:

    @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;
    }