我在集群中有2个独立的wildfly 13,并且在两个节点上都部署了EE应用。
我有一个可缓存的实体(来自hibernate的@Cache和来自jpa的@Cacheable),它也有一个使用缓存的命名查询。
我希望命名查询缓存在实体更新时失效。
当我运行该应用程序时,提供的名为“实体”的缓存正在按预期方式工作:当实体更新时,它确实使整个群集无效(根据jmx,它的类型为invalidation_sync)。
问题出在我的自定义缓存上:它不在部署时启动,而在启动时它是本地缓存。实体更新时不会发生无效。
我试图使用@Startup ejb查找我的自定义缓存,但没有运气(找不到缓存),或者令人惊讶的是,我在org.infinispan.Cache上收到了NoClassDefFoundError。
来自https://developer.jboss.org/thread/276133和https://developer.jboss.org/thread/277425?start=15&tstart=0的建议没有帮助。
我在wildfly配置中添加的自定义缓存未启动:我无法在jmx中看到它,也无法使用Paul Ferraro here按照jndi名称模式建议的jndi查找来获取它。 / p>
以下是实体的相关部分:
@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")
这是我的standalone-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,休眠5.1.14和infinispan 9.2.4。
答案 0 :(得分:0)
更新到Infinispan 9.4并尝试以下操作:
<cache-container module="org.infinispan.extension:ispn-9.4" name="infinispan_container" default-cache="default">
<transport/>
<global-state/>
<distributed-cache name="default"/>
<distributed-cache name="memcachedCache"/>
<distributed-cache name="namedCache"/>
</cache-container>
</subsystem>
public class ExampleApplication {
@Resource(lookup = "java:jboss/datagrid-infinispan/container/infinispan_container")
CacheContainer container;
@Resource(lookup = "java:jboss/datagrid-infinispan/container/infinispan_container/cache/namedCache")
Cache cache;
}
请参阅:http://infinispan.org/docs/stable/user_guide/user_guide.html#accessing_containers_and_caches