如何配置EclipseLink仅缓存指定元数据实体(如ReportType)
EclipseLink 仅缓存元数据实体的配置解决方案
问题背景
基于JPA和EclipseLink开发应用,希望仅缓存永不修改的元数据实体ReportType,但当前配置下ReportType未被存入二级缓存(SQL反复加载该实体),仅当给关联的Report实体添加@Cacheable时两者才会被缓存。
配置问题排查
- 语法错误:
javax.persistence.storeMode和javax.persistence.cache.retrieveMode的取值存在未闭合的引号("USE),导致EclipseLink无法正确解析缓存模式参数。 - 缓存策略冲突:
javax.persistence.sharedCache.mode=ENABLE_SELECTIVE(仅标注@Cacheable的实体缓存)与eclipselink.cache.shared.default=true(默认所有实体开启缓存)配置矛盾,导致缓存逻辑混乱。
正确配置步骤
1. 修正缓存参数语法
将storeMode和retrieveMode的取值修正为合法格式:
<!-- 修正后的缓存模式参数 --> <prop key="javax.persistence.storeMode">USE</prop> <prop key="javax.persistence.cache.retrieveMode">USE</prop>
2. 调整全局缓存策略
为实现"仅缓存指定元数据实体"的需求,需设置全局默认不缓存,仅对标注@Cacheable的实体开启缓存:
<!-- 修正后的Spring JPA缓存配置片段 --> <prop key="javax.persistence.sharedCache.mode">DISABLE_SELECTIVE</prop> <prop key="eclipselink.cache.shared.default">false</prop> <prop key="javax.persistence.storeMode">USE</prop> <prop key="javax.persistence.cache.retrieveMode">USE</prop>
DISABLE_SELECTIVE:默认所有实体不启用二级缓存,仅@Cacheable标注的实体例外eclipselink.cache.shared.default=false:明确全局默认关闭共享缓存,避免配置冲突
3. 保留元数据实体的缓存注解
保持ReportType上的缓存注解不变,确保该实体被单独缓存:
@Entity @Table(name="REPORT_TYPE") @Data @EqualsAndHashCode(callSuper = false) @Cacheable @Cache( type = CacheType.SOFT, size = 1000, expiry = 100000000, coordinationType = CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS ) public class ReportType { // 实体字段省略 }
4. 确保业务实体不被缓存
保持Report实体无@Cacheable注解,确保该实体不会被存入二级缓存。
验证
重启应用后,多次查询Report实体,观察SQL日志:
Report实体的查询SQL会每次执行(未缓存)ReportType实体的查询SQL仅执行一次,后续请求从二级缓存获取
内容的提问来源于stack exchange,提问作者kchetoua
相关产品推荐
相关产品推荐

