Как включить объекты namedCache в infinispan-configs.xml для использования в поддержке его локального запроса namedCache

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

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

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

Документация по 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"/>

и проверка атрибутов Infinispan CacheManager JMX показывает только один из шести именованных кэшей, определенных в 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 wiki, когда она обсуждает кеш сущностей, ссылается на «сущность» namedCache; однако я не могу найти, как создать этот кеш. (Кроме того: меня также беспокоит, что локальный запрос infinispan-configs.xml создается, а временные метки infinispan-configs.xml - нет; вместо этого мы получаем UpdateTimestampsCache, который должен быть определен где-то еще в спящем режиме.)

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

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

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


person Tim Heilman    schedule 13.05.2011    source источник


Ответы (1)


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

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

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

person Tim Heilman    schedule 19.05.2011