WildFly13集群中Infinispan复制缓存无法复制问题求助
你遇到的这个场景挺典型的——集群明明正常组建,失效缓存和Hibernate内部的UpdateTimestamp复制缓存都能正常工作,但自定义的复制缓存却既不启动也不复制。结合你用的WildFly13、Hibernate5.1.14、Infinispan9.2.4这个技术栈,我整理了几个针对性的排查和修复点,应该能帮你解决问题:
1. 先修正实体类的缓存策略配置(最关键的点!)
你的实体类标注了:
@Cache(usage = CacheConcurrencyStrategy.NONE, region = "replicated-entity")
CacheConcurrencyStrategy.NONE的意思是完全禁用该实体的二级缓存,这直接导致你定义的replicated-entity复制缓存根本不会被Hibernate触发使用,自然不会启动和复制。
把它改成适合你业务场景的缓存策略,比如:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "replicated-entity")
可选的策略还有NONSTRICT_READ_WRITE(适合低并发更新场景)或READ_ONLY(只读实体),根据你的业务需求选择即可。
2. 补全复制缓存的基础配置
你定义的复制缓存(比如replicated-query、RPL-myEntityTest)缺少了存储和过期配置,而失效缓存、Hibernate内部缓存是有默认配置兜底的。Infinispan9.x中,缺少这些配置的复制缓存可能无法正确初始化。
给所有自定义复制缓存添加<object-memory>和<expiration>节点,比如:
<replicated-cache name="replicated-query" statistics-enabled="true"> <transaction mode="NON_XA"/> <object-memory size="10000"/> <expiration max-idle="100000"/> </replicated-cache> <replicated-cache name="RPL-myEntityTest" statistics-enabled="true"> <transaction mode="NON_XA"/> <object-memory size="10000"/> <expiration max-idle="100000"/> </replicated-cache>
事务模式的选择要匹配场景:查询缓存用NON_XA或NONE足够,实体缓存如果有更新操作可以用BATCH或NON_XA。
3. 验证查询缓存的区域匹配与触发逻辑
你的NamedQuery已经指定了缓存区域RPL-myEntityTest,但要确保Hibernate真的在使用这个缓存:
- 先执行一次该NamedQuery,触发缓存初始化;
- 开启Hibernate的结构化缓存日志,在
persistence.xml中添加:
查看日志中是否出现<property name="hibernate.cache.use_structured_entries" value="true"/>RPL-myEntityTest的缓存操作记录,确认Hibernate是否正确关联到你定义的复制缓存。
4. 用CLI/JMX确认缓存状态
通过WildFly的CLI命令可以直接查看缓存的运行状态,比如:
/subsystem=infinispan/cache-container=hibernate/replicated-cache=RPL-myEntityTest:read-resource(include-runtime=true)
如果返回的status是STOPPED,说明缓存未被初始化——要么是Hibernate没触发它(比如实体缓存策略不对),要么是配置有问题。
也可以通过JMX查看org.infinispan下的缓存指标,确认缓存是否真的启动、是否有复制消息的收发统计。
5. 开启调试日志定位细节
添加以下日志配置到standalone-full-ha.xml,跟踪Infinispan和Hibernate缓存的详细流程:
<logger category="org.infinispan"> <level name="DEBUG"/> </logger> <logger category="org.hibernate.cache.infinispan"> <level name="DEBUG"/> </logger>
从日志中可以看到:
- 缓存是否被初始化;
- 复制消息是否发送/接收;
- 是否有配置不兼容的错误提示。
补充说明:为什么UpdateTimestamp缓存能正常工作?
Hibernate内部的UpdateTimestamp缓存是特殊处理的,WildFly会自动将其映射到默认的复制模式缓存(后缀repl_async),不需要你显式配置,所以它能正常复制——这也侧面证明你的JGroups集群和Infinispan基础配置是没问题的,问题出在自定义缓存的配置和Hibernate的关联上。
内容的提问来源于stack exchange,提问作者will

