|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Возник такой вопрос. Есть приложение, которое крутится нон-стопом на сервере, и запускается оно по расписанию, и так каждый день. Есть класс, внутри которого происходят преобразования: на вход приходит строка, она сравнивается со значением из БД, конвертируется и возвращается новая строка. Но проблема в том, что метод, который всё это дело конвертирует, обращается к БД для каждой строки, а строк на вход приходит много. При каждом обращении Hibernate делает 3 Select'а, а строк для конвертации около 10.000. Соответственно 30к обращений к БД на ровном месте. Хотелось бы как-то это дело пофиксить. Был вариант с @PostConstruct, но он не годится, так как он срабатывает только при поднятии всего этого спрингового контекста, а приложение крутится и крутится, и данные надо актуализировать. Что я хочу? При запуске приложения по расписанию, при вызове сервиса, который конвертирует строку, инициализировать значения для конвертации из БД только один раз и положить их внутри приложения в какую-нибудь мапу. А дальше по этим значениям быстро через switch/case без обращений к БД. Думал про блок инициализации, но он срабатывает раньше конструктора, поэтому я полагаю, что при обращении к репозиторию через блок инициализации, я получу null, так как спринг еще не успеет подтянуть все зависимости. Как быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 21:18 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Wasteland Rebel, Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи. Во вторых, с чего взял что 30к это много? В третьих непонятна постановка: - в 6 утра каждый день нон стопом это как?))))) Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 22:42 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Wasteland Rebel, Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи. Во вторых, с чего взял что 30к это много? В третьих непонятна постановка: - в 6 утра каждый день нон стопом это как?))))) Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов. 30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа). Нон стопом это так: запускается по расписанию в 6 утра, выгружает статистику за прошедший день и дальше спит до следующего утра. Zzz79 нихуа не понятно,выкладывай код,рисуй бд схемы!!! ты пришел и говоришь у меня болит ЖЁпа,я врач и понимаю что твоя жЁпа может болет изза миллиарда причин - например ты плохо себя вел и тебе дали подсрачник,ты много кушал и у тебя понос,ты гей и тут все понятно тоесть как бы ты товарищ ,обрисуй ситуацию Да я в принципе описал. Суть вопроса: как проинициализировать значения из БД один раз при каждом запуске по Scheduled. Т.е. @PostConstruct, который срабатывает не при создании бина, а при обращении к этому сервис классу. Есть такое решение или нет? Если нет, то вопрос просто отпадет. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 23:18 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Имеет место проблема перформнса. Проблема сложная. Комплексная и ее надо решать сразу на нескольких уровнях. Кеширование на клиенте (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.11.2020, 00:27 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи. Во вторых, с чего взял что Wasteland Rebel, А выше строчку почему не откомментировал? Прдозреваю что не знаешь кеширование ни спринга ни хибера ни вообще любое. А надо знать. Так как кеширование это инициализация один раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 07:49 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Wasteland Rebel 30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа). - они в очереди что ли стоят? - если поставить второй томкат то будет 2 часа? - если 15 к зайдут пол шестого, а остальные в 6? ))))) Логика должна работать? Если вы пришли за хлебом, и очередь. Вы что делаете? Правильно. Идете в соседний или приходите через пол часа. Или достаете сухари. Это кеш))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 07:55 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Wasteland Rebel PetroNotC Sharp Wasteland Rebel, Во первых у хибера есть кеш второго уровня который выкл по умолчанию. Включи. Во вторых, с чего взял что 30к это много? В третьих непонятна постановка: - в 6 утра каждый день нон стопом это как?))))) Все веб приложения это нон стоп и крутятся как белка в колесе в ожидании запросов. 30к много, так это замедляет работу приложения в среднем на полчаса (приложение работает 4 часа). Нон стопом это так: запускается по расписанию в 6 утра, выгружает статистику за прошедший день и дальше спит до следующего утра. Zzz79 нихуа не понятно,выкладывай код,рисуй бд схемы!!! ты пришел и говоришь у меня болит ЖЁпа,я врач и понимаю что твоя жЁпа может болет изза миллиарда причин - например ты плохо себя вел и тебе дали подсрачник,ты много кушал и у тебя понос,ты гей и тут все понятно тоесть как бы ты товарищ ,обрисуй ситуацию Да я в принципе описал. Суть вопроса: как проинициализировать значения из БД один раз при каждом запуске по Scheduled. Т.е. @PostConstruct, который срабатывает не при создании бина, а при обращении к этому сервис классу. Есть такое решение или нет? Если нет, то вопрос просто отпадет. :) Не пойму, в чем проблема. Напиши метод, реализующий логику инициализации, и вызывай его в самом начале джоба. Или я что-то упускаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 02:40 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Если говорить новомодными патернами: Singleton ? ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 13:48 |
|
Обращение к базе один раз со Spring Scheduled.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Если говорить новомодными патернами: Singleton ? ))) Вообще то по умолчанию, в рамках Spring-context все бины синглтоны. Можно их сделать не синглтонами, но там надо поиграть со scope бинов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 21:03 |
|
|
start [/forum/topic.php?fid=59&gotonew=1&tid=2120606]: |
0ms |
get settings: |
4ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
41ms |
get topic data: |
3ms |
get first new msg: |
4ms |
get forum data: |
1ms |
get page messages: |
180ms |
get tp. blocked users: |
0ms |
others: | 283ms |
total: | 524ms |
0 / 0 |