При использовании 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 спящего режима?