我正在使用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(,或者单独加载数据,例如从您自己的线程加载数据。