问题描述
我有一个 apache geode 设置。我已将 geode 与外部数据源 postgres 连接。有一种情况,我在 apache geode 中几乎没有数据,其余的都在 postgres 中。我正在使用查询服务来获取数据,当我触发查询时,我希望 apache geode 应该向我提供存在于其服务器和 postgres 中的数据(对于 apache geode 中不存在的数据)。我该如何继续?
我已加载缓存,如果 Apache Geode 中不存在数据,则会加载该缓存。
'''
@服务
公共类 QuoteLoader 实现 CacheLoader
private static Logger logger = LoggerFactory.getLogger(QuoteLoader.class);
@Autowired
EmployeeImpl employeeImpl;
@Autowired
EmployeeRepository employeeRepository;
public QuoteLoader() {
}
@Override
public void init(Properties props) {
}
@Override
public void close() {
}
@Override
public Employee load(LoaderHelper<String,Employee> helper) throws CacheLoaderException {
Employee value = null;
try {
value = employeeImpl.getEmployeeById(Long.valueOf(helper.getKey()));
} catch (Exception e) {
e.printstacktrace();
logger.error("Error Occured",e);
}
return value;
}
} '''
解决方法
查询引擎只执行 OQL
并返回结果,在查询执行期间不会调用任何 CacheLoader
。 CacheLoader
仅在执行 Region.get(key)
操作时出现缓存未命中时才会调用。
如果你仔细想想,这是完全有道理的......查询是一个可以返回任何结果(包括无)的任意字符串,因此查询引擎无法知道一个条目是否应该是其一部分如果 Geode 区域中不存在实际条目,则返回结果与否。