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

При использовании 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#performance-querycache-enable) утверждает:

Кэш запросов не кэширует состояние реальных объектов в кэше;он кэширует только значения идентификатора и результаты типа значения.По этой причине [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"/>

, а проверка атрибутов CacheManager infinispan JMX показывает только один из шести namedCaches, определенных в 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, в которой обсуждается кэш сущностей, ссылается на "entity" namedCache, однако я не могу найти, как создать этот кеш.Я также беспокоюсь о том, что локальный запрос infinispan-configs.xml создан, а отметки времени infinispan-configs.xml - нет, вместо этого мы получаем UpdateTimestampsCболь, которая должна быть определена где-либо еще в hibernate.) Указание

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

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

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

1 Ответ

3 голосов
/ 19 мая 2011

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

Моя путаница в отношении namedCaches, "entity" и infinaspans файла 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.

...