Я использую топологию клиент-сервер для кеширования hazelcast. У меня есть несколько карт, которые я с нетерпением загружаю с помощью MapLoaders. Когда происходит ошибка кеша - вызывается метод загрузки (ключа) Maploader. Кажется, что метод MapLoader.load (key) выполняется потоком раздела, что означает, что все другие операции с разделом блокируются до завершения загрузки. Очень распространенный вариант использования MapLoader - загрузка данных из БД, что, возможно, может занять некоторое время. Итак, каков наилучший подход, чтобы другие операции с разделом не блокировались во время выполнения laod? Есть ли другой способ загрузить недостающие данные во время выполнения? (Версия Hazelcast: Hazelcast 4.0.3)
Данные загрузки Hazelcast из СУБД в топологии клиент-сервер
Ответы (1)
На этот вопрос есть хороший ответ, который дает несколько вариантов.
MapLoader.load(key)
загружает только одну запись, но если удаленный источник работает очень медленно или много промахов в кэше, он будет установлен.
Другой альтернативой ответу @mike-yawn было бы наличие Runnable
, которое извлекает необходимые элементы из базы данных и записывает их прямо на карту. У вас все еще может быть MapLoader.load(key)
, но вероятность промаха кеша снижается, если ваш код сборщика хорошо предсказывает, какие записи потребуются.
Если вы не кэшируете 100% записей, то промах кеша неизбежен. Если это слишком медленно, вы всегда можете вернуть Entry.Value, который содержит какой-то флаг, указывающий на то, что это заполнитель, и запустить поток для фактической загрузки. Затем ваш код должен иметь дело с этим заполнителем и повторить попытку позже, отмечая, что, когда он попытается позже, конечным результатом запроса к базе данных может быть отсутствие записи.
loadAllKeys()
и loadAll(Collection<K>)
методов? Если база данных работает очень медленно, лучше всего избегать перезапуска.
- person Neil Stevenson; 22.03.2021