使用本地缓存时Gemfire出现NoAvailableServerException问题咨询
解决GemFire本地缓存下QueryService.execute()抛出NoAvailableServerException的问题
我来帮你分析问题根源,并给出不用修改业务代码的解决方案:
问题原因
你用<gfe:client-cache>配置的本地缓存,本质上还是GemFire客户端缓存——哪怕是local-only模式,它默认的QueryService是面向远程服务器的客户端查询服务。当你调用query.execute()时,它会尝试连接GemFire服务器执行查询,但你的本地环境没有服务器,所以抛出NoAvailableServerException。
而region.query()方法是直接在本地Region实例上执行查询,绕过了远程查询服务的逻辑,所以能正常返回数据。
解决方案
要让原有代码(使用Cache.getQueryService())在本地缓存下正常工作,最直接的方式是把本地缓存的配置从客户端缓存改为Peer缓存(纯本地缓存):
将你的本地缓存配置:
<gfe:client-cache id="cache" />
替换为:
<gfe:cache id="cache" />
这样配置后,getCache().getQueryService()会返回本地查询服务,执行query.execute()时会直接在本地缓存中处理查询,不会再尝试连接服务器,也就不会抛出异常了,而且完全不需要修改你的业务代码。
备选方案(如果需要保留客户端缓存特性)
如果你确实需要客户端缓存的某些特性(比如PDX序列化),又不想改代码,还可以通过Spring的BeanPostProcessor来替换默认的QueryService,但这种方式相对复杂。不过如果允许极小的代码调整,也可以直接获取本地查询服务:
QueryService queryService = ((ClientCache) getCache()).getLocalQueryService();
但考虑到你不想修改原有代码,替换为Peer缓存的配置是最优解。
内容的提问来源于stack exchange,提问作者Greg Karas
相关产品推荐
相关产品推荐

