我正在研究一个通过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()时,例如通过在一个&#34; run&#34;中组合两个片段,然后entrySet()看到所有键。只有当entrySet()是对personMap的第一次实际访问时才会出现问题。
更新:在调用entrySet()之前,我还尝试了显式加载:
IMap<Long, Person> personMap = hazelcastInstance.getMap("personMap");
personMap.loadAll(true);
结果相同 - 仅加载键3到6。我的群集只包含一个节点。