2012-09-26 38 views
6

我們使用Hazelcast 2.3.1,我們hazelcast.xml配置文件,我們 使用的Hazelcast IMAP寫的背後:Hazelcast地圖被鎖定

<map name="HazelcastObjectOperations.objectMap"> 
     <backup-count>1</backup-count> 
     <map-store enabled="true"> 
      <class-name>persister.HazelcastObjectPersister</class-name> 
      <write-delay-seconds>10</write-delay-seconds> 
     </map-store> 
</map> 
<properties> 
     <property name="hazelcast.map.cleanup.delay.seconds">5</property> 
</properties> 

我們得到了兩個班

  1. HazelcastObjectOperation其中包含地圖,並且 用於將對象放入其中。
  2. HazelcastObjectPersister使用擴展MapStore 來持久存在當Hazelcast調用storeAll()時的對象。
public class HazelcastObjectOperation 
    { 

     protected final IMap<Long, MyHzcObj> objectMap; 
     private final HazelcastInstance instance; 

     public HazelcastObjectOperation() 
     { 
      this.instance = Hazelcast.getDefaultInstance(); 
      this.objectMap = this.instance.getMap(
           "HazelcastObjectOperations.objectMap"); 
     } 

     public void save(final MyHzcObj object) 
     { 
      long start = System.currentTimeMillis(); 
      IdGenerator generator = Hazelcast.getIdGenerator("generator"); 
      this.objectMap.put(generator.newId(), object); 
      long end = System.currentTimeMillis(); 
     } 
    } 

問題是當Hazelcast貫穿本地圖並且取出 對象應被存儲在持留 類的storeAll方法,在地圖上被鎖定爲秒,所以投入到這個地圖這一次持續 。有沒有解決這個問題的方法?

回答

3

這是一個Hazelcast問題,並通過固定:https://github.com/hazelcast/hazelcast/issues/293

順便說一句: 注意,它始終是更好地使用set()代替put()如果你不需要的舊值。該問題與put()嘗試加載舊值(如果已定義mapstore)有關。 set()不會嘗試加載舊值,因此它更快更乾淨。