2014-02-24 30 views
0

我需要删除的项目从Hazelcast分布式地图和我使用这样的代码(简化):什么是从Hazelcast地图中删除元素的正确方法?

public void realeaseBatchesById(int Id) { 

    Iterator<Map.Entry<Long, WorkingBatch>> it = workingMap.entrySet().iterator(); 

    while (it.hasNext()) { 
     WorkingBatch value = it.next().getValue(); 
     if (value.getServer().getId() == idd) { 
     it.remove(); 
     } 
    } 

    } 

但是这个代码不删除值,地图的大小是在一开始同作为最后的尺寸。

当我看到Hazelcast Javadoc时,我看到这个接口只定义了通过键和键值来删除。这是否意味着我无法使用标准的方法来从地图中删除值?

+0

您是否试过'equals'而不是== ==? –

+0

找到确定要删除的值没有问题 - 我找到了它们。但无法通过'it.remove()'移除它们。' – user2148736

回答

10

从地图中删除一个项目,你不能通过迭代器来完成。迭代器是入口集的临时副本,其更改不反映地图的内容。

由于您在地图中的所有条目上进行迭代,因此您的方法不是非常具有可扩展性,想象您拥有千兆字节的地图条目。在找到您的条目之前,大约需要发送50%的数据。

如果你想删除一个项目,你可以做:

map.remove(somekey) 

但最大的问题是:你如何找到您的项目。在你万一你的项目显然有某种server.id的,所以你可能会创建该ID的索引,所以你可以做一个快速查找,并与结合起来:

IMap.executeOnEntries(EntryProcessor entryProcessor, Predicate predicate); 

当你创建一个谓语(即找到你的条目)并创建一个入口处理器(可以删除你的条目),你可以做一个更有效的删除。

+0

谢谢,通过map.remove(key)移除对我有用。这个操作是安全的还是我必须自己照顾它?我可以迭代它,因为在地图上会有大约20-30个值。 – user2148736

+1

地图上的所有操作都是线程安全的。但是,如果您想以原子方式在地图上执行多个操作,则需要应用(悲观)锁定,乐观锁定等。 – pveentjer

相关问题