Hazelcast地图已被锁定

luk*_*uko 6 java hazelcast

我们正在使用Hazelcast 2.3.1,在我们的hazelcast.xml配置文件中,我们使用写后面的Hazelcast IMap:

 <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>
Run Code Online (Sandbox Code Playgroud)

我们有两节课

  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();
         }
    }
Run Code Online (Sandbox Code Playgroud)

问题是当Hazelcast运行此映射并获取应该存储在persister类的storeAll方法中的对象时,映射会被锁定几秒钟,因此放入此映射会持续一次.这个问题有什么解决方案吗?

jav*_*nes 3

这是 Hazelcast 问题,已修复:https ://github.com/hazelcast/hazelcast/issues/293

顺便说一句:请注意,如果您不需要旧值,则最好使用set()旧值。put()该问题与put()如果定义了映射存储则尝试加载旧值有关。set()不会尝试加载旧值,因此它更快更干净。