Подтвердить что ты не робот

Hibernate & EHCache: как работает maxElementsInMemory?

Я сконфигурировал EHCache с по умолчаниюCache (для элементов), стандартныйQueryCache (для запросов) и UpdateTimestampsCache (для чего я считаю, что отслеживать обновления баз... но я действительно не понимаю, что именно это делает).

Я установил maxElementsInMemory для каждого из этих кешей, но то, что я не получаю, это то, что этот номер контролирует для StandardQueryCache и для UpdateTimestampsCache. Я получаю, что количество объектов, которые могут кэшироваться в кеше по умолчанию, не должно превышать 10000, но кеш запросов не кэширует элементы. Он кэширует первичные ключи (насколько я понимаю).

Значит ли это, что maxElementsInMemory для StandardQueryCache контролирует количество "строк" ​​из результатов или управляет количеством пар первичных ключей для элементов, которые могут иметь?

Как насчет UpdateTimestampsCache? Он отслеживает последний раз, когда объект был обновлен, последний раз, когда таблица была обновлена ​​... или что-то еще? Какое число я должен использовать для maxElementsInMemory для этого?

Спасибо!

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect"     dynamicConfig="true">
  <defaultCache 
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </defaultCache>

  <cache
    name="org.hibernate.cache.internal.StandardQueryCache"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </cache>

  <cache
    name="org.hibernate.cache.spi.UpdateTimestampsCache"
    maxElementsInMemory="10000"
    eternal="true">
  </cache>

</ehcache>
4b9b3361

Ответ 1

Для кэширования запросов результатом каждого результата запроса является одна запись в области StandardQueryCache. Таким образом, ваш кеш в настоящее время настроен для кэширования 10000 различных результатов запроса в области по умолчанию/без имени. Запросы, используемые для использования именованной области (Query # setCacheRegion), записываются в другую область кэша.

Эти результаты должны быть "недействительными" при изменении базовых данных. Это цель UpdateTimestampsCache. Когда Hibernate записывает в таблицы, он вносит записи в UpdateTimestampsCache (этот процесс активируется только тогда, когда кеш запросов включен, так как он явно является частью недействительности данных кэшированных запросов). При чтении результатов кэшированных запросов мы проверяем тайм-тайм, кешированный с результатами запроса, на отметки времени всех таблиц, которые он использует, чтобы определить, остаются ли результаты действительными. Лучше всего не ограничивать этот регион, если это возможно. Если вам нужно, лучший номер - это количество таблиц в вашей базовой модели домена. В противном случае кешированные результаты запроса могут стать недействительными, когда это не требуется. Трудно представить, что у вас есть 10000 таблиц, так что вы, вероятно, хорошо там.