Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Обращение к базе один раз со Spring Scheduled.  [new]
Wasteland Rebel
Member

Откуда:
Сообщений: 5
Возник такой вопрос.

Есть приложение, которое крутится нон-стопом на сервере, и запускается оно по расписанию, и так каждый день. Есть класс, внутри которого происходят преобразования: на вход приходит строка, она сравнивается со значением из БД, конвертируется и возвращается новая строка. Но проблема в том, что метод, который всё это дело конвертирует, обращается к БД для каждой строки, а строк на вход приходит много. При каждом обращении Hibernate делает 3 Select'а, а строк для конвертации около 10.000. Соответственно 30к обращений к БД на ровном месте.

Хотелось бы как-то это дело пофиксить. Был вариант с @PostConstruct, но он не годится, так как он срабатывает только при поднятии всего этого спрингового контекста, а приложение крутится и крутится, и данные надо актуализировать.

Что я хочу? При запуске приложения по расписанию, при вызове сервиса, который конвертирует строку, инициализировать значения для конвертации из БД только один раз и положить их внутри приложения в какую-нибудь мапу. А дальше по этим значениям быстро через switch/case без обращений к БД.

Думал про блок инициализации, но он срабатывает раньше конструктора, поэтому я полагаю, что при обращении к репозиторию через блок инициализации, я получу null, так как спринг еще не успеет подтянуть все зависимости.

Как быть?
18 ноя 20, 21:18    [22234933]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Wasteland Rebel,
Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи.
Во вторых, с чего взял что 30к это много?
В третьих непонятна постановка:
- в 6 утра каждый день нон стопом это как?)))))
Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов.
18 ноя 20, 22:42    [22234982]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
нихуа не понятно,выкладывай код,рисуй бд схемы!!!
ты пришел и говоришь у меня болит ЖЁпа,я врач и понимаю что твоя жЁпа может болет изза миллиарда причин - например ты плохо себя вел и тебе дали подсрачник,ты много кушал и у тебя понос,ты гей и тут все понятно

тоесть как бы ты товарищ ,обрисуй ситуацию
18 ноя 20, 23:07    [22234995]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
Wasteland Rebel
Member

Откуда:
Сообщений: 5
PetroNotC Sharp
Wasteland Rebel,
Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи.
Во вторых, с чего взял что 30к это много?
В третьих непонятна постановка:
- в 6 утра каждый день нон стопом это как?)))))
Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов.

30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа).
Нон стопом это так: запускается по расписанию в 6 утра, выгружает статистику за прошедший день и дальше спит до следующего утра.

Zzz79
нихуа не понятно,выкладывай код,рисуй бд схемы!!!
ты пришел и говоришь у меня болит ЖЁпа,я врач и понимаю что твоя жЁпа может болет изза миллиарда причин - например ты плохо себя вел и тебе дали подсрачник,ты много кушал и у тебя понос,ты гей и тут все понятно

тоесть как бы ты товарищ ,обрисуй ситуацию

Да я в принципе описал. Суть вопроса: как проинициализировать значения из БД один раз при каждом запуске по Scheduled. Т.е. @PostConstruct, который срабатывает не при создании бина, а при обращении к этому сервис классу. Есть такое решение или нет? Если нет, то вопрос просто отпадет. :)
18 ноя 20, 23:18    [22235001]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Имеет место проблема перформнса. Проблема сложная. Комплексная и ее надо решать сразу на нескольких уровнях.

Кеширование на клиенте (EhCache?) да - это решение но его надо проговаривать с бизнесом. Обычно кеширование
не очень дружит с консистентностью и этот поинт надо обсуждать. Так просто наобум нельзя совать кеши куда угодно.
Так - бы к любой БД ставили кеши в драйвер и все-бы летало и свистело. Но нелетает...

Из путей что я вижу.

1) Хранимая процедура в БД которая выполнит вместо 3х select запросов 1 call stored procedure. Это уменьшит сетевой траф.
2) Bulk/Batch операция которая исполнит на сервере (опять-же хранимая процедура) все 30 000
data-rows и отдаст отчот на клиент в виде одной большой выборки.
3) Bulk/Batch операция на клиенте которая скачивает одним курсором весь объем данных
по какому-то признаку. Сделает весь процессинг на клиенте (In-Memory? In-Collection? In-Nosql?)

Все эти пути - компромиссы и их надо обсуждать с бизнес-owners кабы чего не вышло.

Каким образом к перформансу автор привязал @PostConstruct я не очень понимаю.

Сообщение было отредактировано: 19 ноя 20, 00:22
19 ноя 20, 00:27    [22235019]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
PetroNotC Sharp
Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи.
Во вторых, с чего взял что


Wasteland Rebel,
А выше строчку почему не откомментировал?
Прдозреваю что не знаешь кеширование ни спринга ни хибера ни вообще любое.
А надо знать.
Так как кеширование это инициализация один раз.
19 ноя 20, 07:49    [22235064]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Wasteland Rebel
30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа).
нужно подробнее.
- они в очереди что ли стоят?
- если поставить второй томкат то будет 2 часа?
- если 15 к зайдут пол шестого, а остальные в 6?
)))))
Логика должна работать?
Если вы пришли за хлебом, и очередь. Вы что делаете?
Правильно. Идете в соседний или приходите через пол часа. Или достаете сухари. Это кеш)))))
19 ноя 20, 07:55    [22235066]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
Псевдомизантроп
Member

Откуда:
Сообщений: 1592
Wasteland Rebel
PetroNotC Sharp
Wasteland Rebel,
Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи.
Во вторых, с чего взял что 30к это много?
В третьих непонятна постановка:
- в 6 утра каждый день нон стопом это как?)))))
Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов.

30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа).
Нон стопом это так: запускается по расписанию в 6 утра, выгружает статистику за прошедший день и дальше спит до следующего утра.

Zzz79
нихуа не понятно,выкладывай код,рисуй бд схемы!!!
ты пришел и говоришь у меня болит ЖЁпа,я врач и понимаю что твоя жЁпа может болет изза миллиарда причин - например ты плохо себя вел и тебе дали подсрачник,ты много кушал и у тебя понос,ты гей и тут все понятно

тоесть как бы ты товарищ ,обрисуй ситуацию

Да я в принципе описал. Суть вопроса: как проинициализировать значения из БД один раз при каждом запуске по Scheduled. Т.е. @PostConstruct, который срабатывает не при создании бина, а при обращении к этому сервис классу. Есть такое решение или нет? Если нет, то вопрос просто отпадет. :)


Не пойму, в чем проблема.

Напиши метод, реализующий логику инициализации, и вызывай его в самом начале джоба. Или я что-то упускаю?
20 ноя 20, 02:40    [22235817]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Если говорить новомодными патернами:

Singleton ? )))
20 ноя 20, 13:48    [22236019]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к базе один раз со Spring Scheduled.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5596
Leonid Kudryavtsev
Если говорить новомодными патернами:

Singleton ? )))


Вообще то по умолчанию, в рамках Spring-context все бины синглтоны.
Можно их сделать не синглтонами, но там надо поиграть со scope бинов.
22 ноя 20, 21:03    [22236732]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить