результаты запроса не найдены в кеше - PullRequest
2 голосов
/ 23 июля 2010

Env: JBoss 5.1, ehcache 2.1.0, hibernate 3.3.x, шов 2.2.0

ehcache.xml (версия 2.1.0) содержит следующие строки, но результаты моего запроса не найдены вкэш.Я должен установить область кэша для каждого из запросов, которые запускаются.Что мне здесь не хватает?

<!-- Cache configuration -->
<cache name="org.hibernate.cache.UpdateTimestampsCache"
    maxElementsInMemory="5000" eternal="true" timeToIdleSeconds="300"
    timeToLiveSeconds="300" overflowToDisk="true" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="300" memoryStoreEvictionPolicy="LRU" />

<cache name="org.hibernate.cache.StandardQueryCache"
    maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300"
    timeToLiveSeconds="300" overflowToDisk="true" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="300" memoryStoreEvictionPolicy="LRU" />

1 Ответ

4 голосов
/ 23 июля 2010

Должен ли я установить область кэша для каждого из запущенных запросов. Что мне здесь не хватает?

Нет, это не так (если только вы не хотите иметь над ними мелкий контроль). Вот что говорит Документация по теме:

19,4. Кеш запросов

Наборы результатов запроса также могут кэшироваться. Это полезно только для запросов, которые часто запускаются с тем же параметры. Сначала вам нужно включить кеш запросов:

hibernate.cache.use_query_cache true

Этот параметр создает два новых кэша регионы: один держит кешированный запрос наборы результатов (org.hibernate.cache.StandardQueryCache), другие временные метки удержания последние обновления для запросов таблицы (org.hibernate.cache.UpdateTimestampsCache). Обратите внимание, что кеш запросов не кэшировать состояние реальных объектов в наборе результатов; он только кеширует значения идентификатора и результаты значения тип. Кеш запросов должен всегда использоваться вместе с кэш второго уровня .

Большинство запросов не получают выгоды от кэширование, поэтому по умолчанию запросы не кэшируется. Чтобы включить кеширование, позвоните Query.setCacheable(true). Этот звонок позволяет запросу искать существующие кэшировать результаты или добавлять свои результаты в кеш при его выполнении.

Если вам требуется мелкозернистый контроль политики истечения срока действия кэша запросов, Вы можете указать именованную область кэша для конкретного запроса, позвонив Query.setCacheRegion().

List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger")
    .setEntity("blogger", blogger)
    .setMaxResults(15)
    .setCacheable(true)
    .setCacheRegion("frontpages")
    .list();

Если запрос должен принудительно обновить его область кэша запросов, вы должны вызов Query.setCacheMode(CacheMode.REFRESH). Это особенно полезно в случаях где основные данные, возможно, были обновляется с помощью отдельного процесса (т.е. не модифицируется через Hibernate) и позволяет приложению выборочно обновить конкретные наборы результатов запроса. Это более эффективная альтернатива выселению области кеша запросов через SessionFactory.evictQueries().

Теперь вопрос:

  • Вы включили кэш второго уровня?
  • Вы включили кэширование сущностей, о которых идет ваш запрос?
  • действительно ли вы разрешаете кэширование своего запроса, вызывая setCacheable(true)?

Это не связано, но я также предлагаю активировать ведение журнала категории org.hibernate.cache.

Смотри также

...