Java Portal | Программирование
12.7K subscribers
1.26K photos
105 videos
38 files
1.22K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Как прогреть кэши в Spring Boot?

Или вообще как выполнить что-то на старте Spring Boot приложения?

Обычно такие операции делают в @PostConstruct или подписываются на событие ApplicationReadyEvent. Но у этих вариантов есть заметный минус.

Если “прогрев” находится в @PostConstruct, как отключить его в тестах? Можно добавить флаг, сделать сабкласс и подменить его в тестовой конфигурации, но это не всегда помогает и часто выглядит как костыль.

Более элегантный способ “прогреть кэши”

Смотри: SpringApplication.run(...) возвращает полностью готовый контекст. Можно достать из него компонент и вызвать нужный метод “прогрева”.

Код выглядит как на картинке:

Плюс: В интеграционных тестах с @SpringBootTest метод main не запускается. Соответственно, код внутри него не выполняется. Никаких костылей вокруг @PostConstruct, все чисто и красиво.

Когда “прогрев” все-таки нужен в тестах, добавляем параметр use main method:

@SpringBootTest(useMainMethod = SpringBootTest.UseMainMethod.ALWAYS)


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Java: используй ReentrantReadWriteLock, если у тебя частые чтения и мало записей.

ReentrantReadWriteLock это утилита конкурентности в Java, которая дает два типа локов:

1. Read lock (лок на чтение): позволяет нескольким потокам читать одновременно, пока ни один поток не пишет.

2. Write lock (лок на запись): позволяет писать только одному потоку и блокирует всех остальных читателей и писателей, пока лок не будет освобожден.

Используй ReentrantReadWriteLock, когда:

1. Твой код часто читает разделяемые данные.

2. Записи происходят редко.

3. Ты хочешь выжать максимум параллелизма: разрешить нескольким читателям работать одновременно, но гарантировать, что запись идет строго эксклюзивно.

Пример:

public class SharedValue {
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int value = 0;

public int readValue() {
lock.readLock().lock();
try {
return value;
} finally {
lock.readLock().unlock();
}
}

public void writeValue(int newValue) {
lock.writeLock().lock();
try {
value = newValue;
} finally {
lock.writeLock().unlock();
}
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4