Как реализовать кэширование справочников из БД в Java-приложении с учётом многопоточности?
Answer from AI
sobes.tech AI
Для кэширования справочников из БД в 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
}
}
Такой подход гарантирует, что при одновременном запросе одного ключа загрузка из БД произойдёт только один раз, а остальные потоки получат результат из кэша.