2014-02-24 29 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

相關問題