Ehcache从net.sf.ehcache 2.10.9.2迁移至org.ehcache 3.10.8的问题咨询
Ehcache 2.x 升级至 3.x 问题解答
1. Element 和 CacheExceptionHandler 的替代方案
- net.sf.ehcache.Element:Ehcache 3.x 移除了
Element包装类,直接使用键值对进行缓存操作即可,无需额外包装。例如原代码cache.put(new Element(key, value))可直接替换为cache.put(key, value)。 - CacheExceptionHandler:对应替代方案是
CacheEventListener(用于监听缓存操作中的异常),或者通过ExceptionHandlingConfiguration配置全局异常处理逻辑,在缓存构建时指定异常处理策略。
2. Ehcache 3.x 升级技巧
- 先掌握核心API差异:3.x 是完全重构的版本,API风格从命令式转为声明式,重点熟悉
CacheManagerBuilder、CacheConfiguration、Expiry等核心类的用法。 - 分模块逐步升级:不要一次性替换所有缓存代码,先从非核心业务的缓存模块开始迁移,验证无问题后再覆盖核心模块。
- 利用迁移辅助工具:官方提供了ehcache-3-migration-tool,可以帮助识别2.x代码中需要替换的API和配置项。
- 重点关注配置变化:3.x 的XML配置格式与2.x差异极大,建议优先使用Java代码配置(类型安全,易排查问题),若保留XML配置需参考3.x的Schema重新编写。
- 验证缓存行为一致性:迁移后要重点测试缓存的过期策略、序列化/反序列化、命中率等指标,确保与2.x行为一致。
- 注意序列化方式:3.x 默认使用Java序列化,但推荐使用更高效的序列化机制(如Kryo),需提前配置序列化器。
3. 规范迁移文档及GroupId变更说明
- GroupId变更原因:Ehcache 3.x 是项目重构后的版本,groupId从
net.sf.ehcache变更为org.ehcache,属于项目归属调整后的规范变更。 - 官方迁移文档:官方提供了完整的迁移指南,涵盖API映射、配置转换、存储层适配、常见问题等内容,可直接参考官方文档进行系统迁移。
代码适配示例
原Ehcache 2.x代码
CacheManager cm = CacheManager.getInstance(); Cache cache = cm.getCache("AccessTokenCache"); CacheConfiguration config = cache.getCacheConfiguration(); cache.put(new Element(TOKEN_CACHE_KEY, accessToken)); config.setTimeToLiveSeconds(AccessTokenResponse.getExpire() - 120);
适配后的Ehcache 3.x代码
// 初始化CacheManager CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true); // 定义缓存配置(支持动态修改) MutableConfiguration<String, AccessTokenResponse> cacheConfig = new MutableConfiguration<>() // 指定键值类型,保证类型安全 .setTypes(String.class, AccessTokenResponse.class) // 设置TTL过期时间 .setExpiry(Expirations.timeToLiveExpiration(Duration.ofSeconds(AccessTokenResponse.getExpire() - 120))); // 创建或获取缓存 Cache<String, AccessTokenResponse> cache = cacheManager.getCache("AccessTokenCache", String.class, AccessTokenResponse.class); if (cache == null) { cache = cacheManager.createCache("AccessTokenCache", cacheConfig); } // 执行缓存写入 cache.put(TOKEN_CACHE_KEY, accessToken); // 若需要动态修改TTL(比如过期时间变化时) Duration newTtl = Duration.ofSeconds(newExpireTime - 120); cacheManager.updateCacheConfiguration("AccessTokenCache", cacheConfig.withExpiry(Expirations.timeToLiveExpiration(newTtl)));
注意:Ehcache 3.x 中缓存配置默认是不可变的,若需要动态调整配置,需使用
MutableConfiguration,并通过cacheManager.updateCacheConfiguration方法更新配置。
内容的提问来源于stack exchange,提问作者JAVA TELEPHONIC INTERVIEW
相关产品推荐
相关产品推荐

