Hi Alexey,
Thank you for the response.
I changed my code based on your recommendation and i think with all the
different options I was trying I ended up with a sub-par code!
The below code does the update very fast (few secs)
Collection<Integer> res = ignite.compute().broadcast(
new IgniteCallable<Integer>() {
/** Auto-inject ignite instance. */
@IgniteInstanceResource
private Ignite ignite;
@Override public Integer call() {
IgniteCache<FactKey, Fact> cache =
ignite.getOrCreateCache("Fact");
Iterator<Cache.Entry<FactKey, Fact>> iterator =
cache.localEntries().iterator();
FactKey key;
Integer cnt = 0;
while (iterator.hasNext()) {
key = iterator.next().getKey();
cache.invoke(key, (entry, args) -> {
Fact val = entry.getValue();
// do some logic
val.setAmount(val.getAmt1() +
val.getAmt2());
return val;
});
cnt++;
if(cnt%100 == 0) {
System.out.println(">>> Update Count: " +
cnt);
}
}
return cnt;
}
}
);
In regards to your comment on cache will not get updated using invoke. How
do I ensure that the new computed value gets stored in the cache.
The first goal is to iterate through the cache and update a specific data
field in the cache in the fastest way possible.
The second goal is to - the cache has writethrough/writebehind enabled and
hence the updates will need to be propagated to the database as well.
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/