Sobes.tech
Back to questions
Middle
6

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

Companies where asked
Финансовые платформы

Answer from AI

sobes.tech AI

Для кэширования справочников из БД в 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
    }
}

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