You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WildFly13集群中Infinispan复制缓存无法复制问题求助

解决WildFly13集群中Hibernate复制缓存不启动/不复制的问题

你遇到的这个场景挺典型的——集群明明正常组建,失效缓存和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:40:35