Как прогреть кэши в Spring Boot?
Или вообще как выполнить что-то на старте Spring Boot приложения?
Обычно такие операции делают в
Если “прогрев” находится в
Более элегантный способ “прогреть кэши”
Смотри:
Код выглядит как на картинке:
Плюс: В интеграционных тестах с
Когда “прогрев” все-таки нужен в тестах, добавляем параметр
👉 Java Portal
Или вообще как выполнить что-то на старте Spring Boot приложения?
Обычно такие операции делают в
@PostConstruct или подписываются на событие ApplicationReadyEvent. Но у этих вариантов есть заметный минус.Если “прогрев” находится в
@PostConstruct, как отключить его в тестах? Можно добавить флаг, сделать сабкласс и подменить его в тестовой конфигурации, но это не всегда помогает и часто выглядит как костыль.Более элегантный способ “прогреть кэши”
Смотри:
SpringApplication.run(...) возвращает полностью готовый контекст. Можно достать из него компонент и вызвать нужный метод “прогрева”.Код выглядит как на картинке:
Плюс: В интеграционных тестах с
@SpringBootTest метод main не запускается. Соответственно, код внутри него не выполняется. Никаких костылей вокруг @PostConstruct, все чисто и красиво.Когда “прогрев” все-таки нужен в тестах, добавляем параметр
use main method:@SpringBootTest(useMainMethod = SpringBootTest.UseMainMethod.ALWAYS)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Java: используй
1. Read lock (лок на чтение): позволяет нескольким потокам читать одновременно, пока ни один поток не пишет.
2. Write lock (лок на запись): позволяет писать только одному потоку и блокирует всех остальных читателей и писателей, пока лок не будет освобожден.
Используй
1. Твой код часто читает разделяемые данные.
2. Записи происходят редко.
3. Ты хочешь выжать максимум параллелизма: разрешить нескольким читателям работать одновременно, но гарантировать, что запись идет строго эксклюзивно.
Пример:
👉 Java Portal
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();
}
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍4