使用AffinityKey向Apache Ignite缓存添加数据失败求助
问题根源与解决方案
问题原因
.NET瘦客户端的**单个键操作(如Put、Get)**不支持带有[AffinityKeyMapped]属性的自定义键类型。这是因为瘦客户端在处理单键请求时会执行本地亲和校验,但该特性并未在单键操作逻辑中实现;而批量操作(如PutAll)会直接将所有键值对传递给服务端,由服务端负责亲和键的处理,因此可以正常执行。
另外你已经在CREATE TABLE语句中通过AFFINITY_KEY=COMPANYID指定了服务端的亲和键规则,客户端键类上的[AffinityKeyMapped]标记属于重复定义,反而触发了瘦客户端的校验逻辑。
解决方案
方案一:移除键类的亲和属性标记
直接删除PERSONKEY中的[AffinityKeyMapped]属性,服务端会通过表定义的AFFINITY_KEY=COMPANYID处理分区逻辑,客户端无需额外标记:
public record PERSONKEY( [property: QuerySqlField(NotNull = true)] long COMPANYID, [property: QuerySqlField(NotNull = true)] long PERSONID);
修改后,单个Put方法即可正常执行,同时SQL查询、批量操作的逻辑不受影响,亲和分区依然按COMPANYID生效。
方案二:统一使用批量操作或SQL写入
如果必须保留键类的亲和属性标记,那么在瘦客户端中仅使用批量方法(如PutAll),或者通过SQL语句直接插入数据:
// 使用SQL写入示例 cache.Query(new SqlFieldsQuery( "INSERT INTO PERSON (COMPANYID, PERSONID, FIRSTNAME, LASTNAME) VALUES (?, ?, ?, ?)", key.COMPANYID, key.PERSONID, value.FIRSTNAME, value.LASTNAME )).GetAll();
内容的提问来源于stack exchange,提问作者JoshSub
相关产品推荐
相关产品推荐

