Ignite从2.7升级至2.10.0后cache.replace(K,V,V)返回false问题求助
问题根因
- 首先是Apache Ignite版本迭代带来的默认行为变更:2.7及更早版本执行
cache.replace(K, oldVal, newVal)这类CAS操作时,默认直接对比序列化后的二进制字节数组是否一致,不需要反序列化调用Java对象的equals方法;从2.8版本开始,默认调整为优先反序列化为Java对象,调用对象自身的equals方法做等值校验,这是导致你升级后操作返回false的核心诱因。 - 其次你的实体类等值判断逻辑配置存在缺陷:
Employee类标注了@EqualsAndHashCode(callSuper=true, onlyExplicitlyIncluded = true),但类内部没有任何字段标注@EqualsAndHashCode.Include,导致子类自身的所有字段都不参与等值和哈希计算,仅会调用父类的equals方法。- 示例代码中实体类实现的
Serialisable接口存在拼写错误,正确应为java.io.Serializable,拼写错误会导致序列化异常,可能出现反序列化后对象属性缺失的问题。
- 额外补充:你提供的
updateEmpolyee递归调用存在参数不匹配、重试次数未递减的逻辑问题,容易触发死循环。
解决方案
- 如果你希望完全对齐2.7版本的CAS行为,不需要调用对象
equals方法做校验,可以直接修改缓存配置,添加参数setBinaryComparatorEnabled(false),即可恢复为二进制字节数组直接对比的逻辑,升级后无需修改业务代码即可正常运行。 - 如果你需要保留新版本的equals比较逻辑,需要修复实体类的注解配置:
- 移除
Employee类上的onlyExplicitlyIncluded = true配置,或者给需要参与等值比较的字段添加@EqualsAndHashCode.Include注解。 - 修正序列化接口的拼写错误,确保实体类可以正常序列化和反序列化。
- 移除
- 验证方案:可以在调用
replace方法前,手动打印cacheValue.equals(oldValue)的返回值,若返回false即可确认是等值比较逻辑不匹配导致的问题,按照上述方案修复即可。 - 修正
updateEmpolyee方法的递归逻辑,补全参数,每次重试时将maxRetry参数减1,避免死循环。
内容的提问来源于stack exchange,提问作者Chanel
相关产品推荐
相关产品推荐

