2016-02-16 4 views
5

Я пытаюсь настроить Infinispan как спящий кэш второго уровня. Все в порядке, но я хочу настроить конфигурацию по умолчанию, то есть значения, которые все кэшируют совместно.Infinispan JPA Значения кэша второго уровня

Кэши автоматически создаются для объектов, аннотированных @Cache, и я могу их настроить по одному в infinispan.xml по <distributed-cache-configuratoin>. Тем не менее, я хотел бы иметь значения по умолчанию (например, стратегию выселения) для всех этих кешей.

Другое дело, я хочу отметить все эти сгенерированные кеши как «распределенные» (по умолчанию они «локальны»).

Вот exceprt из моего infinispan.xml:

<cache-container default-cache="default" statistics="true"> 
    <transport stack="external-file" /> 
    <!-- Configuring specifics for the User entity. How to do it globally? --> 
    <distributed-cache-configuration name="user" statistics="true" /> 
</cache-container> 

Как сделать эти вещи?

+1

Конфигурация кэша по умолчанию называется 'entity'. Настройте кеш, имеющий это имя, и он должен применяться ко всем объектам. –

+0

Ницца .. спасибо. у вас есть ссылка из документации для этого? – Bozho

+1

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#caching-provider-infinispan-config –

ответ

4

default cache configuration сущностей называются entity:

конфигурация кэш может отличаться для каждого типа данных, хранящихся в кэше . Для того, чтобы переопределить шаблон конфигурации кэша, используйте свойство hibernate.cache.infinispan.data-type.cfg где data-type может быть один из:

entity лиц проиндексированных @Id или @EmbeddedId атрибута.

immutable-entity Объекты с тегами @Immutable аннотация или набор как mutable=false в файле сопоставления.

naturalid Объекты, индексированные их атрибутом @NaturalId.

collection Все коллекции.

timestamps Тип объекта сопоставления → временная метка последней модификации. Используется для кэширования запросов.

query Сопоставление запроса → результат запроса.

pending-puts Вспомогательные тайники для регионов, использующих режим недействительности кэш.

по умолчанию для collection, immutable-entity и naturalid также конфигурация указана для entity, так что вам не придется настраивать их отдельно (если вы не хотите создавать отдельные конфигурации, конечно), как это можно видеть в documentation и source code.

Примечание

В общем, что делает кэш Hibernate L2 распределенный не может быть хорошей идеей, поскольку экземпляры сущностей хранятся в disassembled hydrated state в кэше L2, а это означает, что только идентификаторы ассоциированных сущностей хранятся вместе с состоянием родительского объекта.

Предположим, у вас есть следующие объекты (A, B, C все кэшировать):

@Entity 
public class A { 
    @ManyToOne 
    private B b; 

    @OneToMany 
    private Collection<C> cs; 
} 

Даже если cs коллекции были кэшируются также, чтобы полностью собрать A экземпляр сущности из кэша вы бы следующие сетевые поездки в другие узлы кластера:

  1. Извлечь объект A.
  2. Извлечь сущность B состояние на основе идентификатора, хранящегося в ассоциации b.
  3. Извлечь коллекцию cs ids.
  4. Для каждого идентификатора в коллекции cs выберите состояние объекта C, один за другим.

Очевидно, что если вы собираете из коллекции A экземпляров (из результата запроса, например), все вышеперечисленное выполняется для каждого экземпляра A.

Все это означает, что чтение данных из базы данных напрямую (с правильно настроенной ленивой загрузкой, например, с использованием batch size), может быть намного более эффективным, чем все сетевые обходы в распределенном кеше.

Кроме того, это одна из причин, по которой кеш сущности/коллекции должен работать в режиме кластера недействительности (данные кэшируются только на узле, который читает/записывает его, но недействителен на других узлах при изменении).

Смежные вопросы