据我所知,当使用MapLoader时,Hazelcast会在拥有拥有地图名称的分区的节点上调用loadAllKeys()
一次。
loadAll(Collection<Long> keys)
检索的给定密钥的分区上调用 loadAllKeys()
。在此之后,根据需要在集群周围分配值。
我正在持久存储中使用一个节点,一个地图和一个记录执行基本测试。
我发现loadAllKeys()
被正确调用一次,但loadAll(Collection<Long> keys)
被调用两次。为什么会这样?
我对loadAll(Collection<Long> keys)
的实施如下:
@Override
public synchronized Map<Long, MyCacheEntry> loadAll(Collection<Long> keys) {
return myCacheRepository.loadMyCacheDataForKeys(keys)
.stream()
.collect(Collectors.toMap(MyCacheEntity::getId,
entity -> gson.fromJson(entity.getValue(), MyCacheEntry.class)
));
}
这意味着我正在对我的持久存储进行两次查找,而不是一次。看到我的数据库中有一条记录,我希望loadAll(Collection<Long> keys)
只能被调用一次。
这里发生了什么?
我的原始测试Hazelcast / Spring配置如下:
@Configuration
public class HazelcastConfiguration {
private final MyMapStore myMapStore;
@Inject
HazelcastConfiguration(@Lazy MyMapStore myMapStore) {
this.myMapStore = myMapStore;
}
@PreDestroy
public void shutdown() {
Hazelcast.shutdownAll();
}
@Bean
public HazelcastInstance hazelcastInstance() {
Config config = new Config();
config.getGroupConfig().setName("MyGroup");
NetworkConfig networkConfig = config.getNetworkConfig();
networkConfig.setPortAutoIncrement(false);
JoinConfig joinConfig = networkConfig.getJoin();
joinConfig.getMulticastConfig().setEnabled(false);
joinConfig.getTcpIpConfig().setEnabled(true).setMembers(Collections.singletonList("127.0.0.1"));
MapConfig mapConfig = new MapConfig("MyMap");
mapConfig.setBackupCount(1);
mapConfig.setAsyncBackupCount(1);
mapConfig.setInMemoryFormat(InMemoryFormat.OBJECT);
mapConfig.setTimeToLiveSeconds(0);
EntryListenerConfig entryListenerConfig = new EntryListenerConfig();
entryListenerConfig.setImplementation(new MyCacheEntryListener());
mapConfig.addEntryListenerConfig(entryListenerConfig);
MapStoreConfig mapStoreConfig = new MapStoreConfig();
mapStoreConfig.setInitialLoadMode(MapStoreConfig.InitialLoadMode.EAGER);
mapStoreConfig.setWriteDelaySeconds(1);
mapStoreConfig.setImplementation(myMapStore);
mapConfig.setMapStoreConfig(mapStoreConfig);
config.addMapConfig(mapConfig);
return Hazelcast.newHazelcastInstance(config);
}
}