Как реализовать кэширование справочников из БД в Java-приложении с учётом многопоточности?

Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:

Короткий ответ

Что ответить на собеседовании

Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:

Подробный разбор

Ответ с пояснениями

Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:

  1. Использование потокобезопасных коллекций — например, ConcurrentHashMap для хранения кэша.
  2. Инициализация кэша при старте приложения или ленивое заполнение с использованием double-checked locking, чтобы избежать одновременной загрузки данных несколькими потоками.
  3. Обновление кэша можно реализовать через периодическую перезагрузку (например, с помощью ScheduledExecutorService) или по событию.
  4. Использование готовых кэш-библиотек — например, Caffeine или Guava Cache, которые уже обеспечивают потокобезопасность и удобные механизмы обновления.

Пример простого кэша с ConcurrentHashMap и ленивой загрузкой:

import java.util.concurrent.*;

public class ReferenceCache {
    private final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();

    public String getValue(String key) {
        return cache.computeIfAbsent(key, k -> loadFromDb(k));
    }

    private String loadFromDb(String key) {
        // Имитация загрузки из БД
        return "Value for " + key;
    }

    // Метод для периодического обновления кэша
    public void refreshCache() {
        // Логика обновления, например, загрузка всех данных и замена содержимого cache
    }
}

Такой подход гарантирует, что при одновременном запросе одного ключа загрузка из БД произойдёт только один раз, а остальные потоки получат результат из кэша.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее