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>
Ответы
Ответ 1
Для кэширования запросов результатом каждого результата запроса является одна запись в области StandardQueryCache. Таким образом, ваш кеш в настоящее время настроен для кэширования 10000 различных результатов запроса в области по умолчанию/без имени. Запросы, используемые для использования именованной области (Query # setCacheRegion), записываются в другую область кэша.
Эти результаты должны быть "недействительными" при изменении базовых данных. Это цель UpdateTimestampsCache. Когда Hibernate записывает в таблицы, он вносит записи в UpdateTimestampsCache (этот процесс активируется только тогда, когда кеш запросов включен, так как он явно является частью недействительности данных кэшированных запросов). При чтении результатов кэшированных запросов мы проверяем тайм-тайм, кешированный с результатами запроса, на отметки времени всех таблиц, которые он использует, чтобы определить, остаются ли результаты действительными. Лучше всего не ограничивать этот регион, если это возможно. Если вам нужно, лучший номер - это количество таблиц в вашей базовой модели домена. В противном случае кешированные результаты запроса могут стать недействительными, когда это не требуется. Трудно представить, что у вас есть 10000 таблиц, так что вы, вероятно, хорошо там.