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

基于Infinispan 13与Wildfly 26.1.3的二级缓存配置后命中率为0求助

问题:Wildfly 26.1.3中Hibernate+Infinispan二级缓存命中率始终为0

我正尝试在Wildfly 26.1.3中通过Hibernate的persistence.xml与standalone.xml配置基于Infinispan的二级缓存,应用已成功部署,但测试时缓存命中率始终为0。


相关配置与代码

persistence.xml核心配置

<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

应用(EAR/WAR)缓存映射配置

<property
    name="hibernate.cache.infinispan.app-ear.ear#appPersistence_PU.com.entity.ResponseCodes.cfg"
    value="response-codes" />
<property
    name="hibernate.cache.infinispan.app-ear.ear#appPersistence_PU.com.entity.ActionCodeTable.cfg"
    value="action-codes" />

standalone.xml中Infinispan缓存定义

<local-cache name="response-codes" statistics-enabled="false">
    <locking isolation="REPEATABLE_READ"/>
    <transaction locking="OPTIMISTIC" mode="FULL_XA"/>
    <heap-memory size="500"/>
    <expiration lifespan="36000000" max-idle="3600000"/>
</local-cache>

<local-cache name="action-codes" statistics-enabled="false">
    <locking isolation="REPEATABLE_READ"/>
    <transaction locking="OPTIMISTIC" mode="FULL_XA"/>
    <heap-memory size="15"/>
    <expiration lifespan="36000000" max-idle="3600000"/>
    <file-store/>
</local-cache>

实体类缓存注解

@Entity
@Table(name = "response_codes")
@XmlRootElement
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "response-codes")
public class ResponseCodes{}

日志输出

2023-07-03 23:00:50,302 INFO
[org.hibernate.engine.internal.StatisticalLoggingSessionEventListener] (default task-3) Session Metrics {
2197300纳秒用于获取8个JDBC连接;
1160300纳秒用于释放8个JDBC连接;
5234100纳秒用于准备12个JDBC语句;
9218700纳秒用于执行12个JDBC语句;
0纳秒用于执行0个JDBC批处理;
448800纳秒用于执行5次L2C写入;
0纳秒用于执行0次L2C命中;
257600纳秒用于执行5次L2C未命中;
17604300纳秒用于执行1次刷新(共刷新8个实体和0个集合);
176800纳秒用于执行1次部分刷新(共刷新1个实体和1个集合)
}


排查与解决思路
  1. 校验缓存区域映射的准确性

    • 确认persistence.xml中缓存映射属性的命名完全匹配实际部署信息:app-ear.ear、appPersistence_PU、实体全类名不能有拼写或大小写错误,否则Hibernate无法关联到对应的Infinispan缓存实例。
    • 实体类@Cache(region="response-codes")的区域名称要和standalone.xml中缓存名称完全一致。
  2. 开启缓存自身统计功能

    • 将standalone.xml中缓存的statistics-enabled改为true,通过Wildfly管理控制台或JMX查看Infinispan缓存的实际命中、写入数据,直接确认缓存是否被正确使用。
  3. 检查数据获取方式是否触发缓存

    • 二级缓存仅在通过EntityManager.find()/getReference()加载实体、或加载关联实体时自动生效;如果用JPQL/HQL查询数据,必须为查询添加缓存提示:query.setHint("org.hibernate.cacheable", true)(原生SQL查询无法触发二级缓存)。
  4. 调整缓存事务与锁模式配置

    • 当前缓存使用FULL_XA事务模式,若数据源非XA类型,可能导致缓存写入后无法读取,建议先改为NON_XA或LOCAL测试。
    • OPTIMISTIC锁模式要求实体类包含@Version版本字段,若ResponseCodes未添加该注解,需补充后再测试缓存效果。
  5. 修正缓存内存与过期配置

    • action-codes的堆内存设置为15(默认单位MB),若实体数量较多会快速触发缓存淘汰,建议先调整为500(与response-codes一致)测试。
    • 确保两次测试查询的间隔不超过max-idle(1小时),避免缓存条目因闲置超时被清理。
  6. 排查类加载与模块兼容性

    • 避免在EAR/WAR包中引入Wildfly已提供的Hibernate、Infinispan依赖,防止类加载冲突;确认standalone.xml中缓存定义在Hibernate默认使用的hibernate缓存容器下。

内容的提问来源于stack exchange,提问作者Tushal Joggesser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:34