Как включить так называемые "entity" кэша в infinispan-configs.xml для использования при поддержке своего namedCache "local-query"

При использовании Hibernate 3.5.6-FINAL в качестве нашего JPA-провайдера и infinispan 4.2.0.ALPHA1 в качестве поставщика кеша запросов уровня 2 меня беспокоит то, что вопреки документации Hibernate результаты базы данных многократно сохраняются в отдельной памяти местоположения (для наборов результатов различных запросов HQL, которые возвращают одни и те же записи) в пределах бесконечной области с именем Cache, "local-query". Поскольку многие из наших часто выпускаемых запросов имеют большое пересечение в своих наборах результатов, это может быстро исчерпать память и сделать кэш запросов бесполезным.

Я подозреваю, что неправильно настраиваю либо бесконечность, либо спящий режим, либо и то и другое, так как я не могу заставить функционировать кэш- сущность 2-го уровня в качестве основы для кеша запросов. Я хотел бы видеть пример infinispan в качестве кэша запросов hibernate-as-JPA level-2, результаты которого сами поддерживаются infinispan в качестве кэша сущностей hibernate-as-JPA level-2.

Подробности:

Документация по Hibernate 3.5 ( http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html) утверждает:

Кэш запросов не кэширует состояние реальных объектов в кэше; он кэширует только значения идентификатора и результаты типа значения. По этой причине [sic] кеш запросов всегда должен использоваться вместе с кешем второго уровня для тех объектов, которые, как ожидается, будут кэшироваться как часть кеша результатов запроса.

Тем не менее, включение кэша запросов уровня 2 в спящем режиме с использованием infinispan (согласно http://community.jboss.org/wiki/usinginfinispanasjpahibernatesecondlevelcacheprovider), как в нашем файле persistence.xml:

        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.use_query_cache" value="true"/>
        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
        <property name="hibernate.cache.infinispan.statistics" value="true"/>

и проверка атрибутов JMX infinispan CacheManager показывает только один из шести namedCache, определенных в infinispan-configs.xml (из GAV org.hibernate/hibernate-infinispan/3.5.6-FINAL, который зависит от GAV org.infinispan/infinispan-core/4.2.0.ALPHA1) создается вместе с не определенным там:

org.hibernate.cache.UpdateTimestampsCache(created)
timestamps(not created)
entity-repeatable(not created)
entity(not created)
local-query(created)
replicated-query(not created)
replicated-entity(not created)

Я подозреваю, что упомянутая выше вики-статья jboss, в которой обсуждается кэш сущностей, ссылается на namedCache "entity"; Однако я не могу найти, как создать этот кэш. (Кроме того: я также беспокоюсь о том, что локальный запрос infinispan-configs.xml создан, а метки времени в файле infinispan-configs.xml нет; вместо этого мы получаем UpdateTimestampsCache, который должен быть определен в другом месте в режиме гибернации.) Указание

        <property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>

в нашем файле persistence.xml, а затем аннотируя соответствующие сущности @javax.persistence.Cacheable (согласно атрибутам JISX infinispan CacheManager) создает созданные кеши сущностей (именуемые как имя класса Java для пакета), но они не используются даже когда статистика JMX показывает высокий коэффициент попадания для локальных запросов (и действительно, впечатляющую производительность для таких запросов кеша).

Является ли мой страх необоснованным, и под прикрытием infinispan хранит информацию об объекте только один раз, даже если она возвращается в наборах результатов нескольких запросов HQL? Если нет, то как правильно получить namedCache в файле infinispan-configs.xml, "сущности", используемые для избежания дублирования хранилища данных сущностей? Наконец, как можно использовать namedCache, "timestamps" в infinispan-configs.xml, а не "org.hibernate.cache.UpdateTimestampsCache", в качестве кеша временных отметок уровня 2 гибернации?

1 ответ

Оказывается, мой страх был необоснованным. Это действительно работает, как указано в документации Hibernate: кеш запросов возвращает только идентификаторы сущностей, а Hibernate собирает эти сущности по отдельности.

Мое замешательство в отношении namedCaches, "entity" и "timestamps" infinispan-configs.xml происходит только из-за ложного ожидания. Поскольку namedCache, "local-query", был определен в infinispan-configs.xml, а атрибуты CacheManager JMX показали созданный кэш с именем "local-query", я ожидал, что то же самое будет сохраняться для "timestamps" и "юридическое лицо." Это не так. Эти namedCaches всегда будут указываться (не создаваться) в атрибутах JMX CacheManager: метки времени, сущность, повторяемый объект, реплицируемый запрос и реплицируемый объект. Тем не менее, конфигурации этих namedCaches соблюдаются, но имена в атрибутах JMX CacheManager не будут совпадать, в отличие от "local-query". Вместо этого они будут именами области кэша: для меток времени, "org.hibernate.cache.UpdateTimestampsCache", а для сущностей - имя класса Java для пакета с указанием пакета.

Я также определил, почему я не получаю попадания в кэш в статистике JMX для моих областей кэша сущностей уровня 2, несмотря на то, что эти области правильно поддерживали кэш запросов. Мой тест и код приложения были настроены таким образом, чтобы каждая сущность, возвращаемая в наборах результатов из кэша запросов, уже находилась в кэше PersistenceContext, который также называется Hibernate Level-1, и поэтому во время сборки наборов результатов из-за попадание в кэш запросов, они обслуживались оттуда, а не из областей кэша сущностей уровня 2.

Другие вопросы по тегам