|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Собственно столкнулся с проблемой такого плана есть сущность в которой одно из полей сделано уникальным есть метод который берет эти сущности и пишет в базу и все бы хорошо,когда все это в однопоточном режиме- просто делаешь запрос в базу - смотришь есть ли там такое значение если есть то скипаешь и все,либо же кладешь все в какой то сет и проверяешь была ли уже такая запись или нет Но вот когда ты сталкиваешься с многопоточкой - то получается полная печаль сделал коллекцию Код: java 1.
но все равно получается не то ,что хочется сам метод выглядит так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
и получаю NullPointer в строчке if (mailList.contains(email.getEmail())) continue; ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:24 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
[quot asv79#22314517] Код: java 1. 2. 3.
я так понимаю что проблема вот тут - в коллекци этот емайл уже есть,но записаться в бд не успело? и получается объекту присваивается null при дебаге в переменных email == null но если сделать evaluate expression этой строчки eMailingMailRepository.findByEmail((String) ((List) mail).get(0)) будет найдено значение может туда thread.sleep на 10-20 милисекунд или не в этом дело? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:34 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Очень много кастов, сложно понимать что тут происходит.. Еще и закомментирована строка. Было бы здорово показывать тут чистый код, без лишнего. Если бросается NPE, то либо email null, либо mailList. Видимо здесь null возвращается: Код: java 1.
Т.е. в concurrentSkipListSet элемент есть, а в базе уже нет. Добавь еще проверку на null. А в целом - оправдано ли то, что ты дублируешь БД состояние в памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:36 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Эх Стас, закидать бы тебя какашками, как ты сам любишь ;) - 6 использований ((List) mail).get(0)) в одном единственном кусочке кода. Про Introduce variable слыхал ;) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, >есть сущность в которой одно из полей сделано уникальным = по русски это айди ID? Констрейнт? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:42 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Очень много кастов, сложно понимать что тут происходит.. Еще и закомментирована строка. Было бы здорово показывать тут чистый код, без лишнего. Если бросается NPE, то либо email null, либо mailList. Видимо здесь null возвращается: Код: java 1.
Т.е. в concurrentSkipListSet элемент есть, а в базе уже нет. Добавь еще проверку на null. А в целом - оправдано ли то, что ты дублируешь БД состояние в памяти? тут ситуация иная в коллекции элемент уже есть,а в бд в тот момент времени его еще нет получается в случае если в бд у нас лежит такой емайл я прохожу по условию - делаю выборку из бд и ничего там не вижу по дублированию бд - это эксперемент ,так как без коллекции я получал validateConstraintExeption когда я делал проверку на наличие в базе такого емайл - в тот момент времени его еще не было и в момент записи он уже там есть короче хз что делать- может количество потоков уменьшить- сейчас их 8 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:43 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, >есть сущность в которой одно из полей сделано уникальным = по русски это айди ID? Констрейнт? если бы ID ,это наименование почтового ящика- unique constraint ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:44 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
chpasha Эх Стас, закидать бы тебя какашками, как ты сам любишь ;) - 6 использований ((List) mail).get(0)) в одном единственном кусочке кода. Про Introduce variable слыхал ;) ? зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов - я проверял с переменными и без - на 15 к записей я почти 3 минуты проигрываю . Это касается лишь списков ,видимо в силу того что при присвоении значения списку идет дорогое копирование- которое замедляет процесс ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:48 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают. В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. Правда после этого еще желательно Session/EntityManager закрыть или хотя бы очистить.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:51 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
убрал касты для наглядности Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:51 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают. В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. так и что делать - выпиливать эту коллекйию и делать запрос в бд на предмент наличия такой записи- если какой то поток обогнал и записал в это время это значение- второй поток получит эксепшн - и не сможет дальше с этим емайл рабоать- вот этого бы очень не хотелось - хотелость бы отловить ConstraintViolationException но при этом все равно выудить этот емайл и продолжить с ним работу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:57 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают. В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. Правда после этого еще желательно Session/EntityManager закрыть или хотя бы очистить.. Я вообще не очень понимаю, чем могут помочь какие-то списки/мапы и прочее.... Если программа многопотоковая ))), то рано или поздно ее могут захотеть запустить на другом компьютере/ноде и так далее. И все списки/мапы и прочее - пойдут лесом и велосипед полностью оквадроколесится Насчет SELECT так же не понял. SELECT FOR UPDATE - для отсутвующей записи сделать вроде не получится, а делать просто SELECT для проверки и на что-то расчитывать - то как-то ну больно наивно. IMHO единственный нормальный РСУБД вариант INSERT + проверка exception'а. p.s. Проблему автора не понял. Ну собрал велосипед с квадратными колесами - какой смысл спрашивать, что ездить не удобно? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 15:58 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 Stanislav Bashkyrtsev Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают. В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. так и что делать - выпиливать эту коллекйию и делать запрос в бд на предмент наличия такой записи- если какой то поток обогнал и записал в это время это значение- второй поток получит эксепшн - и не сможет дальше с этим емайл рабоать- вот этого бы очень не хотелось - хотелость бы отловить ConstraintViolationException но при этом все равно выудить этот емайл и продолжить с ним работу Еще вопрос - я верно понимаю что это какой-то ETL процесс? Нельзя ли сделать разделение задач по потокам такое, чтоб одни и те же пользователи не создавались в разных потоках? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:01 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Отлавливай исключение, а затем по этому email'у делай снова SELECT в БД. Т.е. теперь-то он точно уже там есть. Еще вопрос - я верно понимаю что это какой-то ETL процесс? Нельзя ли сделать разделение задач по потокам такое, чтоб одни и те же пользователи не создавались в разных потоках? Спасиб за совет ,сейча попробую ,но это видимо затормозит процесс процентов на 30,что печально очень. По разделению никак- это миграция списка рассылок- тоесть у одного клиента вася@mai.ru и у другого может быть такой же ящик в списке ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:09 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 ...это миграция списка рассылок- тоесть у одного клиента вася@mai.ru и у другого может быть такой же ящик в списке Если из реляционной субд в реляционную - то вообще не понятно, нафига нужна Java и многопоток. Смигрировать сначала справочники, потом смигрировать основную таблицу IMHO сначало изобретение проблем, потом доблестное их решение ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:24 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Я вообще не очень понимаю, чем могут помочь какие-то списки/мапы и прочее.... Если программа многопотоковая ))), то рано или поздно ее могут захотеть запустить на другом компьютере/ноде и так далее. И все списки/мапы и прочее - пойдут лесом и велосипед полностью оквадроколесится p.s. Проблему автора не понял. Ну собрал велосипед с квадратными колесами - какой смысл спрашивать, что ездить не удобно? это программа которая будет запущена все один раз,ее суть перенести данные с монго в постгрес ,после миграции монго вырубается надеюсь навсегда ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:25 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Какая миграция если данные не валидные. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:32 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev asv79 ...это миграция списка рассылок- тоесть у одного клиента вася@mai.ru и у другого может быть такой же ящик в списке Если из реляционной субд в реляционную - то вообще не понятно, нафига нужна Java и многопоток. Смигрировать сначала справочники, потом смигрировать основную таблицу IMHO сначало изобретение проблем, потом доблестное их решение ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:33 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 есть сущность в которой одно из полей сделано уникальным есть метод который берет эти сущности и пишет в базу и все бы хорошо,когда все это в однопоточном режиме- просто делаешь запрос в базу - смотришь есть ли там такое значение если есть то скипаешь и все,либо же кладешь все в какой то сет и проверяешь была ли уже такая запись или нет Проблема начинается в самом начале, в непонятной постановке Если в сущности более одного поля и уникальное поле не является PK в исходной системе - то в общем случае, никто не может гарантировать, что одному и тому же e-mail'у будут соответствовать одни и те же данные в других полях Можно, конечно, разрабатывать программы по методу "первое попавшееся", но потом готовьтесь к ошибка "первое попавшееся не попало" ( C ) Если в исходной системе это PK - то проблемы нет. Сначала мигрируем справочник, потом таблицы ссылающиеся на данный справочник Если в исходной системе это не PK - то должны быть критерии, как должно быть выполнено объединение в случае противоречивых данных В крайнем случае, на момент переноса можно данные положить в "плоскую" таблицу , а потом уже из нее с помощью команды SELECT DISTINCT нарезать справочники и смотреть коллизии. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:34 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Выключить констрейнты и ключи. Всосать данные. Потом провалидировать. Так решают без ОРМ и... потоков))) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:34 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, Какая миграция если данные не валидные. а кого это волнует - там вместо интежера может лежать мапа,а вместо мапы например стринг) бизнесу же не обьяснить что монго - сама по себе помойка,так туда кидали все лет 5 наверно,сервис менялся ,а патчи никто не писал. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:36 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Выключить констрейнты и ключи. Всосать данные. Потом провалидировать. Так решают без ОРМ и... потоков))) да это все понятно - кто бы разрешил еше) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:37 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Ну потоки же ты придумал. Если очень нужны то сделай два. Один с начала, другой с конца. Проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp Выключить констрейнты и ключи. Всосать данные. Потом провалидировать. Так решают без ОРМ и... потоков))) да это все понятно - кто бы разрешил еше) ОК. Все равно, постановка хромает. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:42 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, Ну потоки же ты придумал. Если очень нужны то сделай два. Один с начала, другой с конца. Проблемы? а что это даст? дубляж может быть и в начале и в конце и в середине для понимания это большая монго колеккия где то 4 млн записей ,каждая запись содержит от 1 до 30 к ящиков- ящики должны быть уникальны в постгрес ,но в монго нет . получается что 8 потоков к примеру начинают бррать эти записи и писать их в бд,и тут хоть с начала хоть с конца ,хоть снизу или сверху - потоки будут писать дубляж- так как сам понимаешь такого количества уникальных ящиков нет в нашей стране,а записи есть) там процентов 40% наверно дубликаты ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:48 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Почему просто не сделать условный Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 16:52 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Lelouch, Он не умеет без классов ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:00 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, >там процентов 40% наверно дубликаты И..... что с ними делает комп и причем потоки? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:01 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, >там процентов 40% наверно дубликаты И..... что с ними делает комп и причем потоки? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:16 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:24 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp asv79, >там процентов 40% наверно дубликаты И..... что с ними делает комп и причем потоки? if (обработали) continue; ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:36 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp asv79, >там процентов 40% наверно дубликаты И..... что с ними делает комп и причем потоки? 1. Дай DDL "присваивать рассылке")))) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:38 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Есть дубляж строки. Есть дубляж бизнес сущности. Есть дубляж "рассылки". Модель короче давай. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79 пропущено... просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке) if (обработали) continue; так я те про что и пишу что создал) но не успевает база за списком этим - ты почитай первый вопрос как звучал ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 17:59 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79 пропущено... просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке) 1. Дай DDL "присваивать рассылке")))) не могу я сюда никакие ддл выкладывать сам понимаешь почему ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:00 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
хеш мапа не нужна так как емайлы не принадлежат юзерам никаким- я сделал сет - как ты видел в первом сообщении- но проблема видимо в том ,что он быстрей работает чем бд и получается конфликт ну и ты сам выше сказал зачем дублировать состояние бд- я тоже думаю нет смысла в этом списке - надо в бд ходить ,ибо в спике уже запись имеется а в бд еще нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:02 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Накал бреда возрастает ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:04 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp пропущено... 1. Дай DDL "присваивать рассылке")))) не могу я сюда никакие ддл выкладывать сам понимаешь почему Табла user и табла Рассылка из трех полей секретна? Жжешь!)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:05 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Накал бреда возрастает ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:06 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Четвертая тема автора про бд..... Которая секретна ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:07 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79 пропущено... не могу я сюда никакие ддл выкладывать сам понимаешь почему Табла user и табла Рассылка из трех полей секретна? Жжешь!)))) хех петро ты удивишься как сложна и многогранна жизнь .Может через пару лет я расскажу что тут недавно произошло.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:09 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Накал бреда возрастает от вас да- то используй кешированый список ,то зачем дублировать состояние бд)) ладно закройте тему,тут толк есть только от Станислава реальный ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:10 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Слив 4ой темы ТС. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:17 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 Stanislav Bashkyrtsev Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
хеш мапа не нужна так как емайлы не принадлежат юзерам никаким- я сделал сет - как ты видел в первом сообщении- но проблема видимо в том ,что он быстрей работает чем бд и получается конфликт ну и ты сам выше сказал зачем дублировать состояние бд- я тоже думаю нет смысла в этом списке - надо в бд ходить ,ибо в спике уже запись имеется а в бд еще нет. Код: java 1.
С Set'ом прийдется все равно много значений хранить. Если это недопустимо, то можно Bloom Filter использовать, но не знаю есть ли многопоточные реализации. Ибо если лочить весь фильтр, то все потоки в него и будут утыкаться постоянно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:22 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79проблема видимо в том ,что он быстрей работает чем бд и получается конфликт 1. Жесть и бред asv79сталкиваешься с многопоточкой 2. И при чем тут БД ? Блок Код: java 1. 2. 3.
Скорее всего должен быть обернут в synchronized. А если мы хотим еще данный список еще и с БД поддерживать в корректном состоянии, то и insert и commit так же должен быть в этом же блоке synchronized. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:24 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
IMHO Миграция - сложное явление. ETL - тут как бы попроще. В самом слове уже содержится 3 (ТРИ!) разных действия: Extract Transformation Load (insert) Если задача сложна, то никто не мешает задачу разбить на данные простые действия. 1. Вычитали данные из помойки, залили их в том виде, как они есть в нормальную СУБД 2. Дальше банальными SELECT'ами проанилизировали и преобразовали в нужный вид Ну или если Java наше все и SELECT'ами не умеем и данных не много (помещаются в память). 1. Вычитали все данные в память/коллекции Java 2. for'ами, for'ами.... прошлись по коллекциям и подготовили новые "корректные" справочники в виде тех же коллекций 3. Пакетной вставкой все вставили в новую базу IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 18:31 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3.
? Или это слишком банально и содержит мало объектных типов? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 19:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Basil A. Sidorov ...Или это слишком банально и содержит мало объектных типов? IMHO скорее всего не поможет. Ему еще ID'шник из базы получить нужно. А тут даже try { INSERT ... } exception WHEN_NO_DATA_FOUND { SELECT ... } может не помочь, при обычном Read committed ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 19:47 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Код: sql 1.
вернёт заданные поля вставленной записи. Если, конечно, есть поддержка в драйвере. Если нет, то на первом проходе делаем вставку, а на втором - выбираем искомые идентификаторы для всех исходных значений. Коряво, но вполне работоспособно. P.S. Многопоточная вставка это то, что не надо делать с базой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 19:55 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, ID шник пусть сам ставит. Простой счетчик. Впрочем он DDL засекретил)) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 19:56 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Basil A. Sidorov вернёт заданные поля вставленной записи. Если, конечно, есть поддержка в драйвере. Если нет, то на первом проходе делаем вставку, а на втором - выбираем искомые идентификаторы для всех исходных значений. Коряво, но вполне работоспособно. asv79Но вот когда ты сталкиваешься с многопоточкой Одна сессия вставили и НЕ закомитела Вторая сессия пытается вставить - получает exceptin Пытается получить ID-ник SELECT'ом - а облом ))) Первая сессия коммитет, но второй это уже не поможет p.s. в сообщении 22314707 no_data_found конечно опечатка, скорее всего, что-то типа DUP_VAL_ON_INDEX будет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 20:03 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Одна сессия вставили и НЕ закомитела Вторая сессия пытается вставить - получает exceptin Пытается получить ID-ник SELECT'ом - а облом ))) Первая сессия коммитет, но второй это уже не поможет На самом деле так: 1. tx1 началась, вставила запись 2. tx2 началась, при вставке заблокировалась на изменении индекса. Ну а дальше два возможных варианта: 3.a tx1 делает коммит, что разблокирует tx2 и та валится с исключением 3.b tx1 делает rollback, что разблокирует tx2 и та удачно вставляет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 22:28 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать. Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 22:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Без классов прям совсем никак (или mybatics?)? Хотя предложенный ранее insert/on conflict retur... выглядит более логичным. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 00:11 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Leonid Kudryavtsev Одна сессия вставили и НЕ закомитела Вторая сессия пытается вставить - получает exceptin Пытается получить ID-ник SELECT'ом - а облом ))) Первая сессия коммитет, но второй это уже не поможет Получит. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 01:56 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп? А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 04:03 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
crutchmaster asv79 зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп? А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся. смотри я ж не просто так сделал все эти длинные касты- я протестировал с ними и без них - создание нового объекта очень сильно нагружает процесс - и да - пусть код не очень хорошо читаем,но он быстрее где то на 20% орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?))) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:05 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать. Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет.. да у емайл есть id поэтму до кучи мне пришлось переделать их с identity на sequence иначе селекты вообще не проходили - так как присовоение id идет при записи пс.да миграция идет в готовую схему - которую никто не даст менять поэтому приходится работать с невалидными данными со стороны монго и с другой постгрес - которая не отвечает даже 1 нф ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:10 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Basil A. Sidorov ...Или это слишком банально и содержит мало объектных типов? IMHO скорее всего не поможет. Ему еще ID'шник из базы получить нужно. А тут даже try { INSERT ... } exception WHEN_NO_DATA_FOUND { SELECT ... } может не помочь, при обычном Read committed ))) такая схема работает инсерт в try ->exeption ->catch ->select правда скорость оставляет желать лучшего ,но по крайне мере я добился чего и хотел ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:13 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Скорее всего должен быть обернут в synchronized. А если мы хотим еще данный список еще и с БД поддерживать в корректном состоянии, то и insert и commit так же должен быть в этом же блоке synchronized. IMHO посмотри сюда на первое сообщение Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:15 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Stanislav Bashkyrtsev пропущено... Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице. Получит. asv79орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?)))В целом-то сервис не обязательно трогать, только миграцию писать на JDBC. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:20 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
[quot Stanislav Bashkyrtsev#22314670 Я правда не понял зачем ты вообще SELECT делаешь, если у тебя и так email есть.. Получается какой-то бесполезный Код: java 1.
/quot] все очень просто - там три сущности - первая это ящик- далее рассылка и третья M2M тоесть я пишу рассылку далее в цикле прогоняю ящики и м2м для чего нужен такой селект - чтобы у меня на руках был id емайл которй я могу записать в м2м вообщем трай кетч работает - большего и не требуется ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:20 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, >там три сущности - первая это ящик- далее рассылка и третья M2M =незачет. След топик начинай с DDL))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:40 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 09:42 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 орм то тут причем? Притом, что ты пляшешь вокруг него с подпорками и приседаешь. asv79 создание нового объекта Ссылки ты хотел сказать? Нагружает процесс, да? asv79 или мне может пойти к руководству и сказать Да не надо тебе ничего менять, всё нормально. Ты же сам его выбрал и рассказываешь, какой он крутой. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 10:23 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш. вот это новость ) а кто то утверждал что нельзя? а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 10:35 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Многопоточная вставка это то, что не надо делать с базой. в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 10:39 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp asv79, Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш. вот это новость ) а кто то утверждал что нельзя? а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id) Вставляем мастер с айди 123 и потом в детайль с этим же 123. Ничего запрашивать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 10:42 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 Basil A. Sidorov Многопоточная вставка это то, что не надо делать с базой. в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке Ты с работающей однопоточки начать должен был. Потом тюнинг. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 10:44 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79 пропущено... вот это новость ) а кто то утверждал что нельзя? а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id) Вставляем мастер с айди 123 и потом в детайль с этим же 123. Ничего запрашивать не надо. ааа вот оно чо ,а айди то ты где возьмешь) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 11:05 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Выше писал. Счетчик на клиенте. Хоть до миллиарда. Потом вкл индекс PK ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 11:09 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Есть куча решений. Но: - ты не дал DDL - ты слился - ты не сделал однопоточку и не дал цифры ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 11:10 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev asv79Но вот когда ты сталкиваешься с многопоточкой И даже если не касаться азов устройства СУБД, то задлянафига в сугубо последовательном процессе многопоточка? Чтобы оно сразу было и сразу глючило? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 12:39 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 в одном потоке слишком долго ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 12:43 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 13:17 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов. AFAIK Он просто не врубается, что в бд можно залить вообще без PK так как его нет в источнике данных! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 13:46 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Leonid Kudryavtsev Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов. AFAIK Он просто не врубается, что в бд можно залить вообще без PK так как его нет в источнике данных! естественно можно ,кто с этим спорит там дальше идет табла которая многие ко многим- нука умник скажи как ее заполнить не имея id тех представлений - которые в нее пишутся) петро ты как обычно наводишь суету с нулевым кпд - просто засоряя топики вокруг себя - почему тебя еще не удалили с форума - загадка,все меньше и меньше хочется сюда заходить из за тебя ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:41 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Нафиг мне тебя обучать. Будет DDL тогда посмотрим на твое поведение. А так, тебе с джунов не вылезти н и к о г д а) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:49 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, Нафиг мне тебя обучать. Будет DDL тогда посмотрим на твое поведение. А так, тебе с джунов не вылезти н и к о г д а) чему обучать - ты не знаешь вообще ничего - везде во всех темах тебя посылают на три буквы))) учитель нашелся ) уж кто из нас джун - так это ты ) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:51 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, А чего тогда слился уже 4ую тему про бд? Тяжело задачу обрисовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:54 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79, Третья твоя тема 22310872 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:57 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
ТС, Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 15:07 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev ... Может проверишь? Я вот проверил. Да, был не прав. INSERT при вставке в уникальный индекс блокирует запись. Блокировка будет висеть до тех пор, пока первый вставивший не сделает commit и только тогда придет exception. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 15:18 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Вообщем сделал через паралельные стримы задачу) пошел путем декомпозиции сначала разбил монго на группы - группы на юзеров и далее уже миграция по каждому юзеру отдельно это позволило мне вместо MongoCursor затягивать в память кусками данные из монго в виде списка и не уйти в ООМ далее на откуп паралельному стриму нигде нет конфликтов по записи- причем что я убрал все блоки трай кетч работает достаточно быстро ,даже быстрей чем я ожидал так что пока петро тут зубоскалил я таску закрыл) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 15:56 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
PetroNotC Sharp ТС, Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с) я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 15:57 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 PetroNotC Sharp ТС, Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с) я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините 1) ну тут от тебя не всю структуру БД просят, а 2-3 связанные таблицы 2) Можно переименовать поля и таблицы + убрать поля, которые не затрагиваются в рамках того, что ты делаешь ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 19:13 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Lelouch, Разумеется. Я ему выше предложил два потока навстречу. Понятно, если есть сущности, то можно навстречу по сущностям идти. Или параллельно. Как был он джуном, так и останется. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 19:21 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
asv79 я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините Если уж вы обсуждаете рабочие проблемы на публичном форуме, то будьте добры прикладывать минимально воспроизводимые примеры. Не имеете права копипастить - постирайте пальчики о клавиши и набейте "такое же, но без перламутровых пуговиц". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 19:23 |
|
Как избежать проблем )
|
|||
---|---|---|---|
#18+
Basil A. Sidorov asv79 я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините Если уж вы обсуждаете рабочие проблемы на публичном форуме, то будьте добры прикладывать минимально воспроизводимые примеры. Не имеете права копипастить - постирайте пальчики о клавиши и набейте "такое же, но без перламутровых пуговиц". к сожалению не имею права- а менять код целиком - я того рот шатал - лучше на стаке спросить тут то толку набивать новый код руками - петро сразу придет - тему засрет - помощь будет дай бог от пары человек - поэтому однозначное нет коду на этом форуме ,учитывая что они сливают по запросу инфу о тебе ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 21:52 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120462]: |
0ms |
get settings: |
18ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
28ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
1479ms |
get tp. blocked users: |
0ms |
others: | 295ms |
total: | 1831ms |
0 / 0 |