Comment implémenter la mise en cache des référentiels de la base de données dans une application Java en tenant compte de la concurrence?
Réponse de l'IA
sobes.tech IA
Для кэширования справочников из БД в 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
}
}
Такой подход гарантирует, что при одновременном запросе одного ключа загрузка из БД произойдёт только один раз, а остальные потоки получат результат из кэша.