我遇到了执行SQL转换查询的问题。我有一个复制的缓存设置,在各种类中有数千个缓存项。当我运行一个转换查询,该查询从Cache上的Classes返回特定(摘要)项时,看起来查询执行得很好并返回一个Collection。但是,当我遍历集合时,在2,048个项目之后,集合中的各个项目(之前一直是Cast'able)现在很简单,就是'GridCacheQueryResponseEntry',我似乎无法再投射......
是否有2,048项是GridGain中转换查询结果集的限制?
这是我用来查询/转换缓存项的代码(简化了一下)。这适用于2048项,然后抛出异常:
GridCacheQuery<Map.Entry<UUID, Object>> TypeQuery = queries.createSqlQuery(Object.class, "from Object where Type = ? and Ident regexp ?");
GridClosure<Map.Entry<UUID, Object>, ReturnObject> Trans = new GridClosure<Map.Entry<UUID, Object>, ReturnGeometry>() {
@Override public ReturnObject apply(Map.Entry<UUID, Object> e) {
try {
ReturnObject tmp = e.getValue().getReturnObject();
} catch (Exception ex) {ex.getMessage()); }
return tmp;
}
};
Collection<ReturnObject> results = TypeQuery .execute(Trans,"VarA","VarB").get();
Iterator iter = results.iterator();
while (iter.hasNext()) {
try {
Object item = iter.next();
ReturnObjectpoint = (ReturnObject) item;
} catch (Exception ex) {}
}
答案 0 :(得分:0)
GridGain没有这样的限制。无论何时执行查询,您都有两个选择:
GridCacheQueryFuture.get()
方法将整个结果集作为集合。这仅适用于相对较小的结果集,因为结果集中的所有行都必须加载到客户机节点的内存中。GridCacheFutureMethod.next()
迭代结果集。在这种情况下,将逐页从远程节点获取结果。当您完成页面的迭代后,它将被丢弃,然后加载下一个页面。因此,您一次只能有一个页面,这样您就有机会查询任何大小的结果集。至于GridCacheQueryResponseEntry
,你不应该使用它,因为它是一个内部GridGain类,实际上是Map.Entry
接口的简单实现,它表示来自GridGain的键值对高速缓存中。
如果是变换查询,您只能在变换器中获得Map.Entry
实例,而客户端节点将接收已经变换的值,因此我不确定在迭代过程中如何获取它们。您能提供一个关于如何执行查询的小代码示例吗?