Типы кэширования запросов Hibernate - PullRequest
1 голос
/ 18 декабря 2010

В моем приложении 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>

В моем сервлете 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>

и теперь для методов:

один для извлечения одного из пяти pesistant запрашиваемых объектов:

@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 независимо от того, какой метод выполняется.

Что я делаю не так?

1 Ответ

1 голос
/ 18 декабря 2010

Какую версию Hibernate вы используете? Являются ли они частью одной сессии? Если это так, в некоторых версиях Hibernate есть ошибка, которая препятствует работе кэша запросов, если вы все еще находитесь в том же сеансе, в котором был создан кэш запросов. Также попробуйте включить некоторые журналы (уровень DEBUG для org.hibernate.cache, IIRC). Это точно говорит, что происходит.

Вы также можете увидеть эти две JIRA (они представляют собой одну и ту же проблему, только в разных JIRA), чтобы понять, как это сделать правильно. Он также может показать вам, связана ли ошибка с версией Hibernate.

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

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

...