У меня есть 2 автономных wildfly 13 в кластере и приложение EE, развернутое на обоих узлах.
У меня есть кешируемая сущность (@Cache из hibernate и @Cacheable из jpa), а также именованный запрос с использованием кеша.
Я хочу, чтобы именованный кэш запросов проходил аннулирование при обновлении сущности.
Когда я запускаю приложение, предоставленный кеш с именем «entity» работает должным образом: он делает недействительным весь кластер при обновлении объекта (он имеет тип invalidation_sync согласно jmx).
Проблема с моим пользовательским кешем: он не запускается во время развертывания, а когда он запускается, это локальный кеш. При обновлении сущности недействительность не происходит.
Я попытался найти свой пользовательский кеш с помощью @Startup ejb безуспешно (кеш не найден) или, что удивительно, я получил NoClassDefFoundError на org.infinispan.Cache.
Предложения от https://developer.jboss.org/thread/276133 и https://developer.jboss.org/thread/277425?start=15&tstart=0 не помогают.
Пользовательский кеш, который я добавил в конфигурации wildfly, не запускается: я не вижу его в jmx и не могу получить его с помощью поиска jndi, предложенного Полом Ферраро здесь по шаблону имени jndi .
Вот соответствующая часть объекта:
@Entity
@Table(name = "parameter", schema = "public")
@NamedQueries({
@NamedQuery(name = "findByValue", query = "select p from Parameter p where p.valeur = :valeur", hints = {
@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"),
@QueryHint(name = org.hibernate.annotations.QueryHints.CACHE_REGION, value = "invalidation-query"),
@QueryHint(name = QueryHints.CACHE_MODE, value = "NORMAL"),
@QueryHint(name = QueryHints.COMMENT, value = "Parameter.findByValue")
})
})
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "entity")
Вот часть контейнера кэша гибернации моего автономного full-ha.xml:
<cache-container name="hibernate" module="org.infinispan.hibernate-cache">
<transport channel="omega-ee" lock-timeout="60000"/>
<local-cache name="local-query">
<object-memory size="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<invalidation-cache name="entity">
<transaction mode="NON_XA"/>
<object-memory size="10000"/>
<expiration max-idle="100000"/>
</invalidation-cache>
<invalidation-cache name="invalidation-query">
<transaction mode="NON_XA"/>
<object-memory size="10000"/>
<expiration max-idle="100000"/>
</invalidation-cache>
<replicated-cache name="RPL-getParamGenTest" statistics-enabled="true">
<transaction mode="BATCH"/>
</replicated-cache>
<replicated-cache name="replicated-entity" statistics-enabled="true">
<transaction mode="NONE"/>
</replicated-cache>
</cache-container>
persistence.xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="myPersistenceUnit">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/jdbc/myDatasource</jta-data-source>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Код, использованный для поиска jndi, выглядит так:
@Resource(name = "infinispan/replicated-query")
private Cache<?, ?> cache;
Чего мне не хватает?
Я использую wildfly 13, hibernate 5.1.14 и infinispan 9.2.4.