Apache Ignite本地节点执行ScanQuery返回空结果问题排查
ScanQuery.setLocal(true)在客户端节点返回空结果的原因分析
核心原因
Ignite客户端节点没有缓存的主数据副本,而ScanQuery.setLocal(true)只会查询当前节点上的缓存主副本数据,不会访问Near Cache(近缓存),所以返回空结果。
细节拆解
- 客户端节点的存储特性:你配置的是REPLICATED缓存模式,但客户端节点本身不存储缓存的主副本,本地仅维护你配置的Near Cache(用于加速读取的本地缓存)。
- ScanQuery.setLocal(true)的行为:该参数指定查询仅在当前节点的主副本分区上执行,客户端没有主分区数据,自然查不到内容。
- 其他方式正常的原因:
- 不设置
setLocal(true):ScanQuery会默认路由到服务端节点查询主副本数据,因此能返回完整结果。 cache.localEntries(ALL):这个方法明确包含了对当前节点Near Cache的查询,所以能获取到客户端本地近缓存里的条目。
- 不设置
可行解决方案
- 如果要查询客户端本地的近缓存数据,直接使用
cache.localEntries(ALL)即可。 - 如果必须使用ScanQuery,去掉
setLocal(true)参数,让查询路由到服务端执行;或者在服务端节点执行setLocal(true)的查询(服务端有主副本数据)。
内容的提问来源于stack exchange,提问作者user27366003
相关产品推荐
相关产品推荐

