据我所知,在使用 MapLoader 时,HazelcastloadAllKeys()
在拥有拥有地图名称的分区的节点上调用一次。
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);
}
}