0

我正在研究一个通过 MapStore 实现持久保存在 MySQL 数据库中的分布式 IMap 的简单示例。我在数据库表中手动输入了 6 个条目,我想使用 Hazelcast 的 IMap 读取它们。

如果我读到这样的条目:

IMap<Long, Person> personMap = hazelcastInstance.getMap("personMap");
personMap.get(1L));
personMap.get(2L));
personMap.get(3L));
personMap.get(4L));
personMap.get(5L));
personMap.get(6L));

一切正常。当我调试数据库访问时,我看到在第一个 get() Hazelcast 首先预加载键 4、3、5、6,然后是键 1。在第二个 get() 上它加载键 2。在随后的 4 个 get() 行中,密钥已经存在于 personMap 中,因此没有数据库访问权限。到目前为止,一切都很好。

现在,当我将片段替换为:

IMap<Long, Person> personMap = hazelcastInstance.getMap("personMap");
for(Map.Entry<Long, Person>entry : personMap.entrySet()) {
    System.out.println(personMap.get(entry.getKey())); 
}

在循环初始化时,在 entrySet() 调用中,Hazelcast 仅加载键 3、4、5 和 6。因此,此循环不打印键 1 和 2,只打印键 3、4、5 和 6。

任何想法为什么会这样?这是 Hazelcast 3.6

注意:当然,当我在键 1 到 6 已经显式加载后调用 entrySet() 时,例如通过将两个片段组合在一个“运行”中,然后 entrySet() 会看到所有键。仅当 entrySet() 是对 personMap 的第一次实际访问时才会出现问题。

更新:在调用 entrySet() 之前,我还尝试了显式加载:

IMap<Long, Person> personMap = hazelcastInstance.getMap("personMap");
personMap.loadAll(true);

结果是一样的——只加载了键 3 到 6。我的集群只包含一个节点。

4

0 回答 0