Hazelcast 从客户端-服务器拓扑中的 RDBMS 加载数据

问题描述

我将客户端-服务器拓扑用于榛播缓存。我有多个地图,我使用 MapLoaders 急切地加载它们。当出现缓存未命中时,调用 Maploader 的 load(key) 方法。 MapLoader.load(key) 方法似乎是由分区线程执行的,这意味着该分区上的所有其他操作都会被阻塞,直到加载完成。 MapLoader 的一个非常常见的用例是从数据库加载数据,这可能需要一些时间。那么什么是最好的方法,以便在发生 laod 时不会阻塞分区上的其他操作?有没有其他方法可以在运行时加载丢失的数据?(Hazelcast 版本:Hazelcast 4.0.3)

解决方法

this question 有一个很好的答案,提供了一些选项。

MapLoader.load(key) 只加载一个条目,但如果远程源真的很慢或者有很多缓存未命中,它就会加载。

@mike-yawn 答案的另一种替代方法是使用 Runnable 从数据库中获取所需的项目并将它们直接写入地图。您仍然可以使用 MapLoader.load(key),但如果您的提取器代码能够很好地预测需要哪些条目,那么缓存未命中的机会就会减少。

如果您没有缓存 100% 的记录,那么缓存未命中是不可避免的。如果它很慢,你总是可以返回一个 Entry.Value ,它包含某种标志,它是一个占位符,并启动一个线程来完成实际加载。然后您的代码必须处理该占位符并稍后重试——请注意,当它稍后尝试时,数据库查询的最终结果可能找不到记录。