我将Apache Ignite用作由postgres数据库支持的缓存,该数据库太大而无法一次初始化所有缓存。相反,我想根据需要将选择性的片段加载到我的缓存中。我想通过loadCache进行此操作(因为readThroughEnabled模式仅适用于简单的缓存操作,但我不能保证会使用它),该方法接受IgniteBiPredicate作为参数。但是,每当我尝试将IgniteBiPredicate用作过滤器时,都会收到ClassCastExceptions阻止我加载缓存。
这是针对服务器本地的Ignite的单个节点。我尝试使用缓存并对其调用“ loadCache(biPredicate,null)”以尝试加载所需的特定数据。这是我的代码示例,其中删除了一些域详细信息:
public void initFoo(int key){
IgniteCache<Integer, Foo> myCache = getCache(Foo.class);
if (myCache != null){
myCache.loadCache(new IgniteBiPredicate<Integer, Foo>() {
@Override
public boolean apply(Integer integer, Foo foo){
return integer == key;
}
}, null);
}
}
我希望这会导致我的缓存被加载,至少是我对此特定条目所关心的部分。相反,我看到了
"Failed to load cache: Foo"
...(lots of nested exceptions eventually leading to)
...
"Caused by: jvaa.lang.ClassCastException:
org.apache.ignite.internal.binary.BinaryObjectImpl cannot be cast to
com.sms.Foo"
我确信这在我的缓存配置中(至少在Java对象的级别上)不是问题,因为当我执行不带参数的简单loadCache时,整个缓存都可以正常使用。我在做错什么吗?
答案 0 :(得分:0)
基本上,您得到的是BinaryObject,而不是POJO对象。
您可以只选择work with BinaryObject,否则应该有一个设置可以扭转这种现象。例如,在创建缓存时,尝试使用cacheCfg.setStoreKeepBinary(false)。
UPD::我已经检查了它,似乎没有使用storeKeepBinary。无论如何,如果愿意,您可以进行Foo foo = binaryObject.deserialize();
。我仍然不确定这是否是可配置的,或者该闭包是否得到了抛出的结果。