|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Подскажите шаги по улучшению работы конвертации справочных значений. Требования: высокая нагрузка, минимальное время конвертации. Что имеется сейчас и как реализовано: БД Oracle с таблицей: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Код: plsql 1. 2. 3. 4. 5. 6. 7.
Таких строк будем считать более 10к, и возможно добавление и изменение значений. При преобразованиях указывается нужные параметры для получения нового значения: Код: plsql 1.
Запросы выполняются из Java сервиса, по чистому JDBC без ORM прослоек. Интересует: Как можно ускорить преобразование справочных значений? - Наверняка надо кэшировать в памяти, размер кэша предполагаю "не большой". Если кэш - то как синхронизировать значения кэша с тем хранилищем, где хранятся значения справочника? По времени сбрасывать весь кэш или как-то отслеживать время изменения перед преобразованием (но это потенциальная задержка каждого преобразования) Будут ли плюсы от использования NoSQL БД? Может быть есть какие-то готовые opensource продукты для работы со справочниками? Какие есть варианты или предположения: 1. Настроить на Oracle хранение таблицы в памяти или какое-то другое кэширование запросов. минус - запросы по сети и потеря время на этом. 2. Перейти на Postgres (Oracle излишний для этой задачи) и тоже настроить кэширование данных БД. минус - запросы по сети и потеря время на этом. плюс - не нужна лицензия за БД. 3. Использовать какие-то БД типа "ключ-значение" - тут пока пробел. Ключом тогда будет составное значение sys_from + sys_to + code_from + dict_name Будет ли это быстрее чем использование реляционных БД? Готов ответить на ваши вопросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 17:48 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Не очень понятно что именно тормозит. Нужны данные профилирования Java приложения. Это как сделать томограмму больному. Понимаешь да? Иначе мы судим не ботлнек а просто твои мысли на эту тему. Вобще. Если это оракл то у тебя должны быть проиндексированы следующие поля Код: plsql 1.
+опции сжатия индекса надо попробовать потом оционально. Еще есть второй вариант - перестроить табличку в индексно-организованную. Но ты попробуй сначала первый вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:01 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, Если честно не совсем понял задачу... Но понял одно...надо какие-то преобразования над данными. И тут лучше всего подойдёт Пакетные или хранимые процедуры Oracle(pl/sql или Postres (pl/pgsql) Но то если вы можуту изменять код приложения... Вместо Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:06 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Будут ли плюсы от использования NoSQL БД? В общем случае нет. Пока не будет идентифицирован проблемный кусок кода. Если например проблема - сетевая интеракция (медленно летают TCP) пакеты от вашего сервера приложений из Череповца в Чикаго - то хоть какую БД ставь - все равно будет плохо и нудно. Поэтому и нужно точно-точно понять какая java-строка работает медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:16 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, Это - code_to как потом используется? Если результат конвертации записывается в БД, тогда делайте все в пакетной процедуре в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:24 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, Никто не понял задачи. И я тоже. Конвертировать справочник надо одноразово. Зачем тут скорость? При конвертации все работы встают. То есть ночью. Зачем тут скорость? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:33 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Про томограмму понимаю :-) Хочется иметь "кэш" этих данных в самом сервисе, чтобы избежать запросов по сети в БД. Или может быть какую-то inmemory БД поднимать в сервисе и туда переливать данные из реляционной БД, т.к. inmemory поиска кажется будет быстрее. Вопрос больше сводиться к тому как правильно построить кэш который будет наполняться значениям из БД. Как следить за актуальность кэша, как выбрать ключ, если использовать БД типа "ключ-значение", Подойдёт ли тут Redis? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:39 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, По тексту видно что прогер сам себе ищет работу. Почему справочник надо кешировать, а журнал документов нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:48 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Бред какой-то. От начала и до конца. Описываемая задача является стандартной для любой СУБД. Называется .... JOIN Зачем сервис, Java, кэш, Redis или что нибудь другое - вообще не понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:48 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Вопрос больше сводиться к тому ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:48 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, +1))) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:49 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Про томограмму понимаю :-) Хочется иметь "кэш" этих данных в самом сервисе, чтобы избежать запросов по сети в БД. Или может быть какую-то inmemory БД поднимать в сервисе и туда переливать данные из реляционной БД, т.к. inmemory поиска кажется будет быстрее. Вопрос больше сводиться к тому как правильно построить кэш который будет наполняться значениям из БД. Как следить за актуальность кэша, как выбрать ключ, если использовать БД типа "ключ-значение", Подойдёт ли тут Redis? Очень многие вещи в архитектурах создаются итеративно. Тоесть ты ищещь решение. Пробуешь. Плохо? Изменяешь. Наперед никакой архитектор здесь и в прочих форумах тебе никогда не посоветует решение чтоб на всегда. Редис тоже имеет недостатки вида ограниченность памяти и неизвестность сколько TTL ставить на каждую запись. Понимаешь да? Это как транспортная задача. Задача со многими неизвестными. В качестве inmemory dbms я навскидку вспоминаю: Java: Hazelcast, Ignite, Oracle Koherence, Cassandra. Native: Redis, Memcached. Кстати подумай о том как твой кеш будет инвалидироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:53 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
предлагаю автора в бан,кто за ,кто воздержался ?) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:08 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
apb12, )) ТС, Какой из трех вопросов потерял актуальность: - как конвертить спавочник - как кешировать справочник - no sql бд лучше ли оракла для моего проекта ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:11 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
PetroNotC Sharp apb12, )) ТС, Какой из трех вопросов потерял актуальность: - как конвертить спавочник - как кешировать справочник - no sql бд лучше ли оракла для моего проекта ? его вопрос потерял актуальность вот с этой фразой "Запросы выполняются из Java сервиса, по чистому JDBC без ORM прослоек." за это нужно бить палками на площадях,потому что потом их говнокод будут разбирать такие как и проклинать свою жизнь))) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:22 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Мы тоже не используем ORM. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:29 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
apb12, Согласен. Но вдруг у него внешний заказчик с этим сервисом сидит. Тогда там другие законы. Законы а ля soap. Или твой сервис))) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:31 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
mayton Мы тоже не используем ORM. Зато у оракла кеш есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:32 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton Мы тоже не используем ORM. Зато у оракла кеш есть. TimesTen? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:59 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
mayton, нет. Из коробки) Database caches какие в базах данных есть кэши: Buffer cache — кэш данных — cache for data pages/data blocks; Statement cache — кэш операторов и их планов — cache of queries plan; Result cache — кэш результатов строк — rows from queries; OS cache — кэш операционной системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 20:11 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
У всех dbms это есть. Но топик не об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 22:03 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
mayton, Да. Ты выше замечательно сказал - итеративный подход. Его нет у автора. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 22:48 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
apb12 предлагаю автора в бан,кто за ,кто воздержался ?) Предлагаю тебя в бан. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:20 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
apb12 за это нужно бить палками на площадях,потому что потом их говнокод будут разбирать такие как и проклинать свою жизнь))) Вот прям сейчас разбираю говнокод с орм там, где он не нужен. А вообще с твоей компетенцией и так уже всё ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:21 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, 10к записей - это ни о чём. Даже миллион таких записей ява прожуёт на обычном компе. Можешь всё выбрать и разложить по HashMap/TreeMap/поисковым деревьям или тупо по комплексному ключу. Бд тут вообще не при чём, не трогай её, ты дольше ходить будешь по сети. С инвалидацией кэша - не знаю, как у тебя данные обновляются, ничего не могу сказать. Если всё идёт через яву, прям там и синхронизируй всё, вообще никаких проблем. Морфий Готов ответить на ваши вопросы. Какая нагрузка на сервис в запросах/сек? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:29 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Подойдёт ли тут Redis? Да зачем? 10к записей можно в map какой-нибудь запихать и будет тоже самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:30 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Описываемая задача является стандартной для любой СУБД. Называется .... JOIN Чтобы решить что бред, а что нет, надо ответить на следующие вопросы: Какое минимальное время выполнения запроса удалённого клиента на оракле? Какие запросы обрабатывает клиент оракла? Сколько их? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:36 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Про томограмму понимаю :-) Хочется иметь "кэш" этих данных в самом сервисе, чтобы избежать запросов по сети в БД. Или может быть какую-то inmemory БД поднимать в сервисе и туда переливать данные из реляционной БД, т.к. inmemory поиска кажется будет быстрее. Вопрос больше сводиться к тому как правильно построить кэш который будет наполняться значениям из БД. Как следить за актуальность кэша, как выбрать ключ, если использовать БД типа "ключ-значение", Подойдёт ли тут Redis? В зависимости от того как работаешь с БД, можно сделать по разному. Например, если используется Хибернайте, то можно попробовать уже встроенным кешированием в хибернейте. Если справочных значений не много, можно загнать их в HashMap. И т.д. Все зависит какую задачу решаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:42 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
apb12 предлагаю автора в бан ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 09:01 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
[quot apb12#22043550] PetroNotC Sharp apb12, "Запросы выполняются из Java сервиса, по чистому JDBC без ORM прослоек." за это нужно бить палками на площадях,потому что потом их говнокод будут разбирать такие как и проклинать свою жизнь))) Почему нужно бить? Чем плох чистый JDBC при работе с одной таблицей и по факту один SELECT из кода? crutchmaster, спасибо за конструктивные решения и мапами и комплексным ключом. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 10:09 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Чем плох чистый JDBC при работе с одной таблицей и по факту один SELECT из кода? Тем, что он ничего другого не осилил. crutchmaster, спасибо за конструктивные решения и мапами и комплексным ключом. Не за что. Какая нагрузка планируется на систему? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 10:29 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Почему нужно бить? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 11:24 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
crutchmaster Какая нагрузка планируется на систему? Думаю, что не более 1М запросов в день, т.е. в зависимости от пика от 10 до 100 в секунду. Конечно оптимизировать и добиваться производительности на самом начале не рационально, хотелось бы заложить правильный фундамент с расчётом на рост нагрузки. Пока думаю вот над таким вариантом: 1. При инициализации сервиса (модуля) зачитать всё из БД и составить мап с "составным" ключом. Частого изменения справочника не планируется, поэтому можно оставить вариант перезапуска сервиса при изменении справочника. Т.е. получается вариант долго запрягаем, зато быстро ездим. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 11:34 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Морфий Почему нужно бить? Вопрос не относится к сопровождению топика, он про использование JDBC. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 11:39 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий PetroNotC Sharp пропущено... потому что ТС не сопровождает свой топик. Вопрос не относится к сопровождению топика, он про использование JDBC. JDBC - не имеет никаких паттернов относительно преобразования справочников. Почитай про Statement::addBatch() и про возможности ETL базы данных которую ты используешь. Я убежден что твой вопрос вообще другой. Ты лучше подумай. И подними новый топик с пояснением сути твоей проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 11:47 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
mayton Почитай про Statement::addBatch() и про возможности ETL базы данных которую ты используешь. Я убежден что твой вопрос вообще другой. Ты лучше подумай. И подними новый топик с пояснением сути твоей проблемы. Statement::addBatch() не нужен, т.к. у меня только чтение данных из уже готовой таблицы. Спасибо за совет, подумаю получше над вопросом, и тогда открою новый топик. На этом можно считать этот топик закрытым . ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 12:10 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий, Аффтар. Ты опять ничего не понял? Нужно отвечать на посты в топике. Где твоя ПРОБЛЕМА? mayton Я убежден что твой вопрос вообще другой. Ты лучше подумай. И подними новый топик с пояснением сути твоей проблемы. +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 12:11 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Морфий Думаю, что не более 1М запросов в день, т.е. в зависимости от пика от 10 до 100 в секунду. Ну, самый простой hashmap будет выбирать запись гораздо меньше 10 мс, так что на 100+ rqs тонким местом он не будет. Главное строку для ключа сшивай через StringBuilder, а не складыванием. А через что запросы будут идти? Http? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 12:29 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Если преобразование - это ETL то и делать надо средствами ETL. И java тут вообще непричем. Если автор хочет кеширование - то это вообще про другое. И это да. Это Java. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 12:55 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
crutchmaster Ну, самый простой hashmap Хотя автор вопрос закрыл, что тут придумывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 13:00 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Можно еще проще - вообще без оракла. А зачем он тут? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 13:09 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
crutchmaster Leonid Kudryavtsev Описываемая задача является стандартной для любой СУБД. Называется .... JOIN Чтобы решить что бред, а что нет, надо ответить на следующие вопросы: Какое минимальное время выполнения запроса удалённого клиента на оракле? Какие запросы обрабатывает клиент оракла? Сколько их? А при чем тут это? Если есть две таблицы, таблица данных и таблица перекодировки и их надо join'уть, то зачем тут прослойка в виде Java - совершенно не понятно. Если что-то типа ETL, миграции/интеграции и данные из системы переливаются куда-то, то хоть join'и на базе источнике, хоть join'и на безе назначения - без разница, ну а поскольку нормальные люди по одной записи между базами не переливают - то даже сравнивать бессмысленно. Топик как-то выглядит: мы java программисты, а не программисты СУБД, поэтому ни за какие join'ы ничего не знаем, а все будем делать "циклами, циклами" ( C ) данный подфорум Что такое "удаленный клиент" из контекста фразы вообще не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 13:09 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Топик как-то выглядит: мы java программисты Да ну не. Те давно бы уже сделали на мапах и никого не спрашивали. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 13:11 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
crutchmaster Можно еще проще - вообще без оракла. А зачем он тут? ТС вообще не сказал что у него болит и какие симптомы. Пусть учится чем лечить по фотографии непонятно что. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 13:13 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
если я правильно понял тему, то у автора тормозит какой то бизнес процесс из за большого количества выполнений селекта Код: plsql 1.
если оптимизировать средствами оракл, то можно так попробовать, при условии что изменений мало будет 1. хеш. создаем хеш кластер, ключ (dict_name, sys_from, sys_to, code_from), туда подсовываем таблицу. О(1) 2. б-три дерево. создать индекс на (dict_name, sys_from, sys_to, code_from, code_to). О(logN) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 16:22 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Автор. Ты построил индекс что я предлагал? Как это повлияло на перформанс? +Сколько % стало быстрее? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 16:23 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
сладкий бубалех из за большого количества выполнений селекта ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 16:36 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
PetroNotC Sharp сладкий бубалех из за большого количества выполнений селекта а что оптимизатор? один раз распарсил и откомпилировал. а дальше тонны выполнений этого запроса. полная выборка блоков из таблицы, перебор строк в блоке, и в самой строке перебором до нужного поля, на это тоже ресурсы CPU тратятся хоть и блоки таблицы уже в кеше сидят. Ораклисты смотрят AWR, чтобы сказать где точно проблема ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 17:47 |
|
Работа с преобразованием справочников из Java
|
|||
---|---|---|---|
#18+
Выж в суть проблемы смотрите. При преобразованиях указывается нужные параметры для получения нового значения: Этот select запрос участвует в процессе "преобразования" справочника. А значит что он не единичный. А - массовый. И скорее всего его надо сделать на стороне БД. Но мы не можем сделать потому что мы не понимаем всего процесса ETL. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 17:55 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120977]: |
0ms |
get settings: |
26ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
870ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 1291ms |
0 / 0 |