Hazelcast客户端一直等待,直到IMap使用MapLoader的loadAll方法完成加载所有元素。



我正在使用MapLoader将项目从Oracle数据库加载到Hazelcast IMap。数据量很大,加载需要很长时间。在加载地图时,消费者应用程序在iMap上执行GET操作时会被阻止。

有没有什么方法可以避免让客户端等待地图加载完所有元素?

Hazelcast服务器是通过使用Spring Boot应用程序设计的,并将com.hazelcast:hazelcast-all:4.1.1作为依赖项。客户端也是使用com.hazelcast:hazelcast:jar:4.1.1的Spring Boot应用程序。

我在hz服务器应用程序中使用CommandLineRunner在启动时访问地图:hazelcastInstance.getMap("my-imap");

我尝试过LAZY和EAGER两种初始模式,但都无济于事。

下面你可以找到我为地图使用的配置。

in-memory-format: BINARY
metadata-policy: CREATE_ON_UPDATE
statistics-enabled: true
cache-deserialized-values: ALWAYS
backup-count: 0
map-store:
enabled: true
initial-mode: EAGER
class-name: com.example.CustomMapLoader

来自文档:

LAZY-获取或创建映射后,当您第一次使用触发MapStore和MapLoader的IMap操作之一访问映射时,会触发MapLoader.loadAllKeys((方法。LAZY是默认模式。

com.hazelcast.config.MapStoreConfig.InitialLoadMode#LAZY:的javadoc

每个分区都是在第一次触摸时加载的。

因此,当您请求IMap时,它加载所有,然后当您在映射上执行get时,它为该键加载整个分区。它不会加载所有数据。

你有两个选择:

  • 增加分区的数量,因此它将为单个分区加载较少的项目,从而在更短的时间内阻止应用程序

  • 在MapLoader中从loadAllKeys返回null,并且根本不预加载数据(对于特定的键将调用load(,或者单独加载数据,例如从您自己的线程加载数据。

最新更新