基于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个集合)
}
排查与解决思路
校验缓存区域映射的准确性
- 确认
persistence.xml中缓存映射属性的命名完全匹配实际部署信息:app-ear.ear、appPersistence_PU、实体全类名不能有拼写或大小写错误,否则Hibernate无法关联到对应的Infinispan缓存实例。 - 实体类
@Cache(region="response-codes")的区域名称要和standalone.xml中缓存名称完全一致。
- 确认
开启缓存自身统计功能
- 将
standalone.xml中缓存的statistics-enabled改为true,通过Wildfly管理控制台或JMX查看Infinispan缓存的实际命中、写入数据,直接确认缓存是否被正确使用。
- 将
检查数据获取方式是否触发缓存
- 二级缓存仅在通过
EntityManager.find()/getReference()加载实体、或加载关联实体时自动生效;如果用JPQL/HQL查询数据,必须为查询添加缓存提示:query.setHint("org.hibernate.cacheable", true)(原生SQL查询无法触发二级缓存)。
- 二级缓存仅在通过
调整缓存事务与锁模式配置
- 当前缓存使用
FULL_XA事务模式,若数据源非XA类型,可能导致缓存写入后无法读取,建议先改为NON_XA或LOCAL测试。 OPTIMISTIC锁模式要求实体类包含@Version版本字段,若ResponseCodes未添加该注解,需补充后再测试缓存效果。
- 当前缓存使用
修正缓存内存与过期配置
action-codes的堆内存设置为15(默认单位MB),若实体数量较多会快速触发缓存淘汰,建议先调整为500(与response-codes一致)测试。- 确保两次测试查询的间隔不超过
max-idle(1小时),避免缓存条目因闲置超时被清理。
排查类加载与模块兼容性
- 避免在EAR/WAR包中引入Wildfly已提供的Hibernate、Infinispan依赖,防止类加载冲突;确认
standalone.xml中缓存定义在Hibernate默认使用的hibernate缓存容器下。
- 避免在EAR/WAR包中引入Wildfly已提供的Hibernate、Infinispan依赖,防止类加载冲突;确认
内容的提问来源于stack exchange,提问作者Tushal Joggesser
相关产品推荐
相关产品推荐

