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