Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:
Как реализовать кэширование справочников из БД в Java-приложении с учётом многопоточности?
Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для кэширования справочников из БД в Java-приложении с учётом многопоточности можно использовать следующие подходы:
- Использование потокобезопасных коллекций — например,
ConcurrentHashMapдля хранения кэша. - Инициализация кэша при старте приложения или ленивое заполнение с использованием double-checked locking, чтобы избежать одновременной загрузки данных несколькими потоками.
- Обновление кэша можно реализовать через периодическую перезагрузку (например, с помощью
ScheduledExecutorService) или по событию. - Использование готовых кэш-библиотек — например, 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
}
}
Такой подход гарантирует, что при одновременном запросе одного ключа загрузка из БД произойдёт только один раз, а остальные потоки получат результат из кэша.