Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Собственно столкнулся с проблемой такого плана

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

Но вот когда ты сталкиваешься с многопоточкой - то получается полная печаль
сделал коллекцию
oncurrentSkipListSet<String> concurrentSkipListSet

но все равно получается не то ,что хочется
сам метод выглядит так
  if (list.get(0) instanceof List) {
      for (Object mail : list) {
        if (((String) ((List) mail).get(0)).isBlank()) continue;
        EMailingEmail email = new EMailingEmail();
//          var email =eMailingMailRepository.findByEmail((String) ((List) mail).get(0));
        if (concurrentSkipListSet.contains((String) ((List) mail).get(0))) {
          email = eMailingMailRepository.findByEmail((String) ((List) mail).get(0));
        } else {
          email.setEmail((String) ((List) mail).get(0));
          email.setName((String) ((List) mail).get(1));
          email.setUserId(idsMap.get(doc.getString("uid")));

          concurrentSkipListSet.add((String) ((List) mail).get(0));
          eMailingMailRepository.save(email);
        }

        if (mailList.contains(email.getEmail())) continue;
        mailList.add(email.getEmail());


и получаю NullPointer в строчке if (mailList.contains(email.getEmail())) continue;
26 апр 21, 15:24    [22314517]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
[quot asv79#22314517]
        if (concurrentSkipListSet.contains((String) ((List) mail).get(0))) {
          email = eMailingMailRepository.findByEmail((String) ((List) mail).get(0));
      



я так понимаю что проблема вот тут - в коллекци этот емайл уже есть,но записаться в бд не успело? и получается объекту присваивается null
при дебаге в переменных email == null
но если сделать evaluate expression этой строчки eMailingMailRepository.findByEmail((String) ((List) mail).get(0)) будет найдено значение

может туда thread.sleep на 10-20 милисекунд или не в этом дело?
26 апр 21, 15:34    [22314528]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Очень много кастов, сложно понимать что тут происходит.. Еще и закомментирована строка. Было бы здорово показывать тут чистый код, без лишнего.

Если бросается NPE, то либо email null, либо mailList. Видимо здесь null возвращается:
          email = eMailingMailRepository.findByEmail((String) ((List) mail).get(0));
Т.е. в concurrentSkipListSet элемент есть, а в базе уже нет. Добавь еще проверку на null.

А в целом - оправдано ли то, что ты дублируешь БД состояние в памяти?

Сообщение было отредактировано: 26 апр 21, 15:29
26 апр 21, 15:36    [22314531]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
chpasha
Member

Откуда:
Сообщений: 10838
Эх Стас, закидать бы тебя какашками, как ты сам любишь ;) - 6 использований ((List) mail).get(0)) в одном единственном кусочке кода. Про Introduce variable слыхал ;) ?
26 апр 21, 15:40    [22314535]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,

>есть сущность в которой одно из полей сделано уникальным
= по русски это айди ID?
Констрейнт?
26 апр 21, 15:42    [22314536]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
Очень много кастов, сложно понимать что тут происходит.. Еще и закомментирована строка. Было бы здорово показывать тут чистый код, без лишнего.

Если бросается NPE, то либо email null, либо mailList. Видимо здесь null возвращается:
          email = eMailingMailRepository.findByEmail((String) ((List) mail).get(0));
Т.е. в concurrentSkipListSet элемент есть, а в базе уже нет. Добавь еще проверку на null.

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

по дублированию бд - это эксперемент ,так как без коллекции я получал validateConstraintExeption
когда я делал проверку на наличие в базе такого емайл - в тот момент времени его еще не было и в момент записи он уже там есть
короче хз что делать- может количество потоков уменьшить- сейчас их 8
26 апр 21, 15:43    [22314538]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,

>есть сущность в которой одно из полей сделано уникальным
= по русски это айди ID?
Констрейнт?

если бы ID ,это наименование почтового ящика- unique constraint
26 апр 21, 15:44    [22314540]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
chpasha
Эх Стас, закидать бы тебя какашками, как ты сам любишь ;) - 6 использований ((List) mail).get(0)) в одном единственном кусочке кода. Про Introduce variable слыхал ;) ?

зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов - я проверял с переменными и без - на 15 к записей я почти 3 минуты проигрываю .
Это касается лишь списков ,видимо в силу того что при присвоении значения списку идет дорогое копирование- которое замедляет процесс
26 апр 21, 15:48    [22314542]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают.

В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. Правда после этого еще желательно Session/EntityManager закрыть или хотя бы очистить..

Сообщение было отредактировано: 26 апр 21, 15:43
26 апр 21, 15:51    [22314545]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
убрал касты для наглядности
  if (list.get(0) instanceof List) {
      for (Object mail : list) {
        if ( mail.get(0).isBlank()) continue;
        EMailingEmail email = new EMailingEmail();
//          var email =eMailingMailRepository.findByEmail(mail.get(0));
        if (concurrentSkipListSet.contains(mail.get(0)) {
          email = eMailingMailRepository.findByEmail( mail.get(0));
        } else {
          email.setEmail((String) (mail.get(0));
          email.setName((String) (mail.get(1));
          email.setUserId(idsMap.get(doc.getString("uid")));

          concurrentSkipListSet.add(mail.get(0));
          eMailingMailRepository.save(email);
        }

        if (mailList.contains(email.getEmail())) continue;
        mailList.add(email.getEmail());
26 апр 21, 15:51    [22314546]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают.

В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException.

так и что делать - выпиливать эту коллекйию и делать запрос в бд на предмент наличия такой записи- если какой то поток обогнал и записал в это время это значение- второй поток получит эксепшн - и не сможет дальше с этим емайл рабоать- вот этого бы очень не хотелось - хотелость бы отловить ConstraintViolationException но при этом все равно выудить этот емайл и продолжить с ним работу
26 апр 21, 15:57    [22314552]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Stanislav Bashkyrtsev
Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают.

В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException. Правда после этого еще желательно Session/EntityManager закрыть или хотя бы очистить..

Я вообще не очень понимаю, чем могут помочь какие-то списки/мапы и прочее....

Если программа многопотоковая ))), то рано или поздно ее могут захотеть запустить на другом компьютере/ноде и так далее. И все списки/мапы и прочее - пойдут лесом и велосипед полностью оквадроколесится

Насчет SELECT так же не понял. SELECT FOR UPDATE - для отсутвующей записи сделать вроде не получится, а делать просто SELECT для проверки и на что-то расчитывать - то как-то ну больно наивно. IMHO единственный нормальный РСУБД вариант INSERT + проверка exception'а.

p.s. Проблему автора не понял. Ну собрал велосипед с квадратными колесами - какой смысл спрашивать, что ездить не удобно?
26 апр 21, 15:58    [22314554]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
asv79
Stanislav Bashkyrtsev
Как бы ты не пытался обойти проблему со списками - все равно будет вероятность что два INSERT'а пойдут одновременно. Как правило все делают SELECT, а потом INSERT. Но между этими двумя запросами может еще многое произойти. И всегда есть вероятность ошибки. Обычно все забивают.

В нативном SQL некоторые СУБД поддерживают insert ignore. Вставит только если такой записи нет. Но с ORM'ом прийдется все-таки ожидать иногда ConstraintViolationException.

так и что делать - выпиливать эту коллекйию и делать запрос в бд на предмент наличия такой записи- если какой то поток обогнал и записал в это время это значение- второй поток получит эксепшн - и не сможет дальше с этим емайл рабоать- вот этого бы очень не хотелось - хотелость бы отловить ConstraintViolationException но при этом все равно выудить этот емайл и продолжить с ним работу
Отлавливай исключение, а затем по этому email'у делай снова SELECT в БД. Т.е. теперь-то он точно уже там есть.

Еще вопрос - я верно понимаю что это какой-то ETL процесс? Нельзя ли сделать разделение задач по потокам такое, чтоб одни и те же пользователи не создавались в разных потоках?
26 апр 21, 16:01    [22314557]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
Отлавливай исключение, а затем по этому email'у делай снова SELECT в БД. Т.е. теперь-то он точно уже там есть.

Еще вопрос - я верно понимаю что это какой-то ETL процесс? Нельзя ли сделать разделение задач по потокам такое, чтоб одни и те же пользователи не создавались в разных потоках?

Спасиб за совет ,сейча попробую ,но это видимо затормозит процесс процентов на 30,что печально очень.

По разделению никак- это миграция списка рассылок- тоесть у одного клиента вася@mai.ru
и у другого может быть такой же ящик в списке
26 апр 21, 16:09    [22314561]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
asv79

...это миграция списка рассылок- тоесть у одного клиента вася@mai.ru
и у другого может быть такой же ящик в списке

Если из реляционной субд в реляционную - то вообще не понятно, нафига нужна Java и многопоток.
Смигрировать сначала справочники, потом смигрировать основную таблицу

IMHO сначало изобретение проблем, потом доблестное их решение
26 апр 21, 16:24    [22314571]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev

Я вообще не очень понимаю, чем могут помочь какие-то списки/мапы и прочее....

Если программа многопотоковая ))), то рано или поздно ее могут захотеть запустить на другом компьютере/ноде и так далее. И все списки/мапы и прочее - пойдут лесом и велосипед полностью оквадроколесится
p.s. Проблему автора не понял. Ну собрал велосипед с квадратными колесами - какой смысл спрашивать, что ездить не удобно?

это программа которая будет запущена все один раз,ее суть перенести данные с монго в постгрес ,после миграции монго вырубается надеюсь навсегда )
26 апр 21, 16:25    [22314574]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Какая миграция если данные не валидные.
26 апр 21, 16:32    [22314579]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Leonid Kudryavtsev
asv79

...это миграция списка рассылок- тоесть у одного клиента вася@mai.ru
и у другого может быть такой же ящик в списке

Если из реляционной субд в реляционную - то вообще не понятно, нафига нужна Java и многопоток.
Смигрировать сначала справочники, потом смигрировать основную таблицу

IMHO сначало изобретение проблем, потом доблестное их решение
+1
26 апр 21, 16:33    [22314582]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
asv79

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

Проблема начинается в самом начале, в непонятной постановке

Если в сущности более одного поля и уникальное поле не является PK в исходной системе - то в общем случае, никто не может гарантировать, что одному и тому же e-mail'у будут соответствовать одни и те же данные в других полях

Можно, конечно, разрабатывать программы по методу "первое попавшееся", но потом готовьтесь к ошибка "первое попавшееся не попало" ( C )

Если в исходной системе это PK - то проблемы нет. Сначала мигрируем справочник, потом таблицы ссылающиеся на данный справочник
Если в исходной системе это не PK - то должны быть критерии, как должно быть выполнено объединение в случае противоречивых данных

В крайнем случае, на момент переноса можно данные положить в "плоскую" таблицу , а потом уже из нее с помощью команды SELECT DISTINCT нарезать справочники и смотреть коллизии.

IMHO & AFAIK
26 апр 21, 16:34    [22314584]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Выключить констрейнты и ключи. Всосать данные. Потом провалидировать.
Так решают без ОРМ и... потоков)))
26 апр 21, 16:34    [22314585]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
Какая миграция если данные не валидные.

а кого это волнует - там вместо интежера может лежать мапа,а вместо мапы например стринг)
бизнесу же не обьяснить что монго - сама по себе помойка,так туда кидали все лет 5 наверно,сервис менялся ,а патчи никто не писал.
26 апр 21, 16:36    [22314586]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
Выключить констрейнты и ключи. Всосать данные. Потом провалидировать.
Так решают без ОРМ и... потоков)))

да это все понятно - кто бы разрешил еше)
26 апр 21, 16:37    [22314589]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Ну потоки же ты придумал.
Если очень нужны то сделай два. Один с начала, другой с конца.
Проблемы?
26 апр 21, 16:40    [22314596]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
Выключить констрейнты и ключи. Всосать данные. Потом провалидировать.
Так решают без ОРМ и... потоков)))

да это все понятно - кто бы разрешил еше)
третий топик где тебе не разрешают.
ОК.
Все равно, постановка хромает.
26 апр 21, 16:42    [22314599]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
Ну потоки же ты придумал.
Если очень нужны то сделай два. Один с начала, другой с конца.
Проблемы?

а что это даст? дубляж может быть и в начале и в конце и в середине
для понимания это большая монго колеккия где то 4 млн записей ,каждая запись содержит от 1 до 30 к ящиков- ящики должны быть уникальны в постгрес ,но в монго нет .
получается что 8 потоков к примеру начинают бррать эти записи и писать их в бд,и тут хоть с начала хоть с конца ,хоть снизу или сверху - потоки будут писать дубляж- так как сам понимаешь такого количества уникальных ящиков нет в нашей стране,а записи есть)
там процентов 40% наверно дубликаты
26 апр 21, 16:48    [22314605]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 2016
asv79,

Почему просто не сделать условный
INSERT INTO таблица(email, name, userId)
VALUES (?, ?, ?)
ON CONFLICT (email, userId /* или что там у тебя за констраинт */) DO NOTHING 
26 апр 21, 16:52    [22314608]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Lelouch,
Он не умеет без классов
26 апр 21, 17:00    [22314613]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
>там процентов 40% наверно дубликаты
И..... что с ними делает комп и причем потоки?
26 апр 21, 17:01    [22314614]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
>там процентов 40% наверно дубликаты
И..... что с ними делает комп и причем потоки?
просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке)
26 апр 21, 17:16    [22314620]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое:
        ConcurrentMap<String, User> cache = new ConcurrentHashMap<>();
        ...
        if(!cache.containsKey(email)) {
            try {
                User user = new User();
                userDao.save(user);
                cache.put(email, user);
            }catch (ConstraintViolationException e) {
                //ignore
            }
        } 
        User user = cache.computeIfAbsent(email, () -> userDao.findById(email));
        ...


Сообщение было отредактировано: 26 апр 21, 17:20
26 апр 21, 17:24    [22314624]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
asv79,
>там процентов 40% наверно дубликаты
И..... что с ними делает комп и причем потоки?
просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке)
блин. Ну создай список имен ОБРАБОТАННЫХ и потом
if (обработали) continue;
26 апр 21, 17:36    [22314631]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
asv79,
>там процентов 40% наверно дубликаты
И..... что с ними делает комп и причем потоки?
просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке)

1. Дай DDL "присваивать рассылке"))))
26 апр 21, 17:38    [22314634]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,

Есть дубляж строки. Есть дубляж бизнес сущности. Есть дубляж "рассылки".
Модель короче давай.
26 апр 21, 17:40    [22314635]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79
пропущено...
просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке)
блин. Ну создай список имен ОБРАБОТАННЫХ и потом
if (обработали) continue;

так я те про что и пишу что создал) но не успевает база за списком этим - ты почитай первый вопрос как звучал
26 апр 21, 17:59    [22314646]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79
пропущено...
просто не записывать дубляж а брать сущесвующие значние и присваивать его рассылке)

1. Дай DDL "присваивать рассылке"))))

не могу я сюда никакие ддл выкладывать сам понимаешь почему
26 апр 21, 18:00    [22314647]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое:
        ConcurrentMap<String, User> cache = new ConcurrentHashMap<>();
        ...
        if(!cache.containsKey(email)) {
            try {
                User user = new User();
                userDao.save(user);
                cache.put(email, user);
            }catch (ConstraintViolationException e) {
                //ignore
            }
        } 
        User user = cache.computeIfAbsent(email, () -> userDao.findById(email));
        ...

хеш мапа не нужна так как емайлы не принадлежат юзерам никаким- я сделал сет - как ты видел в первом сообщении- но проблема видимо в том ,что он быстрей работает чем бд и получается конфликт

ну и ты сам выше сказал зачем дублировать состояние бд- я тоже думаю нет смысла в этом списке - надо в бд ходить ,ибо в спике уже запись имеется а в бд еще нет.
26 апр 21, 18:02    [22314650]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Накал бреда возрастает
26 апр 21, 18:04    [22314651]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
пропущено...

1. Дай DDL "присваивать рассылке"))))

не могу я сюда никакие ддл выкладывать сам понимаешь почему

Табла user и табла Рассылка из трех полей секретна?
Жжешь!))))
26 апр 21, 18:05    [22314653]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Leonid Kudryavtsev
Накал бреда возрастает
)))))))
26 апр 21, 18:06    [22314654]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Четвертая тема автора про бд..... Которая секретна
26 апр 21, 18:07    [22314657]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79
пропущено...

не могу я сюда никакие ддл выкладывать сам понимаешь почему

Табла user и табла Рассылка из трех полей секретна?
Жжешь!))))

хех петро ты удивишься как сложна и многогранна жизнь .Может через пару лет я расскажу что тут недавно произошло..
26 апр 21, 18:09    [22314659]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev
Накал бреда возрастает

от вас да- то используй кешированый список ,то зачем дублировать состояние бд))
ладно закройте тему,тут толк есть только от Станислава реальный
26 апр 21, 18:10    [22314662]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Слив 4ой темы ТС.
26 апр 21, 18:17    [22314667]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
asv79
Stanislav Bashkyrtsev
Если хочется просто закешировать пользователей, то можно обычную ConcurrentHashMap<Email, User> завести. И проверять там прежде чем делать insert или select. Вставлять в эту мапку всякий раз когда прошел удачный INSERT или не-null SELECT. Что-то такое:
        ConcurrentMap<String, User> cache = new ConcurrentHashMap<>();
        ...
        if(!cache.containsKey(email)) {
            try {
                User user = new User();
                userDao.save(user);
                cache.put(email, user);
            }catch (ConstraintViolationException e) {
                //ignore
            }
        } 
        User user = cache.computeIfAbsent(email, () -> userDao.findById(email));
        ...

хеш мапа не нужна так как емайлы не принадлежат юзерам никаким- я сделал сет - как ты видел в первом сообщении- но проблема видимо в том ,что он быстрей работает чем бд и получается конфликт

ну и ты сам выше сказал зачем дублировать состояние бд- я тоже думаю нет смысла в этом списке - надо в бд ходить ,ибо в спике уже запись имеется а в бд еще нет.
Дак в общем-то не важно, логика та же. Надо просто добавить try/catch для insert'a. У тебя изначально почти все готово было. Я правда не понял зачем ты вообще SELECT делаешь, если у тебя и так email есть.. Получается какой-то бесполезный
select email from USERS where email = ?


С Set'ом прийдется все равно много значений хранить. Если это недопустимо, то можно Bloom Filter использовать, но не знаю есть ли многопоточные реализации. Ибо если лочить весь фильтр, то все потоки в него и будут утыкаться постоянно.

Сообщение было отредактировано: 26 апр 21, 18:16
26 апр 21, 18:22    [22314670]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
asv79
проблема видимо в том ,что он быстрей работает чем бд и получается конфликт

1. Жесть и бред

asv79
сталкиваешься с многопоточкой

2. И при чем тут БД ?

Блок
if (  ! somthing.containts( ... ) ) {
somthing.add( ... )
}


Скорее всего должен быть обернут в synchronized.
А если мы хотим еще данный список еще и с БД поддерживать в корректном состоянии, то и insert и commit так же должен быть в этом же блоке synchronized.

IMHO
26 апр 21, 18:24    [22314673]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
IMHO

Миграция - сложное явление.
ETL - тут как бы попроще. В самом слове уже содержится 3 (ТРИ!) разных действия:

Extract
Transformation
Load (insert)

Если задача сложна, то никто не мешает задачу разбить на данные простые действия.

1. Вычитали данные из помойки, залили их в том виде, как они есть в нормальную СУБД
2. Дальше банальными SELECT'ами проанилизировали и преобразовали в нужный вид

Ну или если Java наше все и SELECT'ами не умеем и данных не много (помещаются в память).
1. Вычитали все данные в память/коллекции Java
2. for'ами, for'ами.... прошлись по коллекциям и подготовили новые "корректные" справочники в виде тех же коллекций
3. Пакетной вставкой все вставили в новую базу

IMHO
26 апр 21, 18:31    [22314679]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
insert into таблица(поля)
values (значения)
where not exist (select null from таблица where условие)
?
Или это слишком банально и содержит мало объектных типов?
26 апр 21, 19:40    [22314703]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Basil A. Sidorov

...Или это слишком банально и содержит мало объектных типов?

IMHO скорее всего не поможет. Ему еще ID'шник из базы получить нужно. А тут даже

try {
INSERT ...
} exception WHEN_NO_DATA_FOUND {
SELECT ...
}

может не помочь, при обычном Read committed )))
26 апр 21, 19:47    [22314707]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
insert ... returning ...
вернёт заданные поля вставленной записи. Если, конечно, есть поддержка в драйвере.
Если нет, то на первом проходе делаем вставку, а на втором - выбираем искомые идентификаторы для всех исходных значений. Коряво, но вполне работоспособно.

P.S.
Многопоточная вставка это то, что не надо делать с базой.
26 апр 21, 19:55    [22314711]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Leonid Kudryavtsev,
ID шник пусть сам ставит. Простой счетчик.
Впрочем он DDL засекретил))
26 апр 21, 19:56    [22314712]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Basil A. Sidorov

вернёт заданные поля вставленной записи. Если, конечно, есть поддержка в драйвере.
Если нет, то на первом проходе делаем вставку, а на втором - выбираем искомые идентификаторы для всех исходных значений. Коряво, но вполне работоспособно.


asv79
Но вот когда ты сталкиваешься с многопоточкой

Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет

p.s. в сообщении 22314707 no_data_found конечно опечатка, скорее всего, что-то типа DUP_VAL_ON_INDEX будет
26 апр 21, 20:03    [22314715]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Leonid Kudryavtsev
Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

На самом деле так:
1. tx1 началась, вставила запись
2. tx2 началась, при вставке заблокировалась на изменении индекса. Ну а дальше два возможных варианта:
3.a tx1 делает коммит, что разблокирует tx2 и та валится с исключением
3.b tx1 делает rollback, что разблокирует tx2 и та удачно вставляет

Сообщение было отредактировано: 26 апр 21, 22:22
26 апр 21, 22:28    [22314780]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать.

Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет..

Сообщение было отредактировано: 26 апр 21, 22:35
26 апр 21, 22:40    [22314789]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Bsplesk
Member

Откуда:
Сообщений: 242
Без классов прям совсем никак (или mybatics?)? Хотя предложенный ранее insert/on conflict retur... выглядит более логичным.
BEGIN;
-- другие операции
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- Предполагая, что здесь возникает ошибка из-за нарушения уникальности ключа,
-- мы выполняем следующие команды:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
-- Продолжение других операций и в завершение...
COMMIT;


Сообщение было отредактировано: 27 апр 21, 00:09
27 апр 21, 00:11    [22314823]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Stanislav Bashkyrtsev
Leonid Kudryavtsev
Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

Получит.
27 апр 21, 01:56    [22314839]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2337
asv79
зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов

Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп?
А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся.

Сообщение было отредактировано: 27 апр 21, 03:59
27 апр 21, 04:03    [22314843]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
crutchmaster
asv79
зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов

Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп?
А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся.

смотри я ж не просто так сделал все эти длинные касты- я протестировал с ними и без них - создание нового объекта очень сильно нагружает процесс - и да - пусть код не очень хорошо читаем,но он быстрее где то на 20%

орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?)))
27 апр 21, 09:05    [22314882]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать.

Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет..

да у емайл есть id поэтму до кучи мне пришлось переделать их с identity на sequence иначе селекты вообще не проходили - так как присовоение id идет при записи

пс.да миграция идет в готовую схему - которую никто не даст менять поэтому приходится работать с невалидными данными со стороны монго и с другой постгрес - которая не отвечает даже 1 нф
27 апр 21, 09:10    [22314883]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev
Basil A. Sidorov

...Или это слишком банально и содержит мало объектных типов?

IMHO скорее всего не поможет. Ему еще ID'шник из базы получить нужно. А тут даже

try {
INSERT ...
} exception WHEN_NO_DATA_FOUND {
SELECT ...
}

может не помочь, при обычном Read committed )))

такая схема работает
инсерт в try ->exeption ->catch ->select
правда скорость оставляет желать лучшего ,но по крайне мере я добился чего и хотел
27 апр 21, 09:13    [22314884]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev


Скорее всего должен быть обернут в synchronized.
А если мы хотим еще данный список еще и с БД поддерживать в корректном состоянии, то и insert и commit так же должен быть в этом же блоке synchronized.

IMHO

посмотри сюда на первое сообщение

СoncurrentSkipListSet<String> concurrentSkipListSet
27 апр 21, 09:15    [22314887]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Leonid Kudryavtsev
Stanislav Bashkyrtsev
пропущено...
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

Получит.
Может проверишь? Я вот проверил.
asv79
орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?)))
В целом-то сервис не обязательно трогать, только миграцию писать на JDBC.

Сообщение было отредактировано: 27 апр 21, 09:13
27 апр 21, 09:20    [22314889]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
[quot Stanislav Bashkyrtsev#22314670 Я правда не понял зачем ты вообще SELECT делаешь, если у тебя и так email есть.. Получается какой-то бесполезный
select email from USERS where email = ?


/quot]
все очень просто - там три сущности - первая это ящик- далее рассылка и третья M2M
тоесть я пишу рассылку далее в цикле прогоняю ящики и м2м
для чего нужен такой селект - чтобы у меня на руках был id емайл которй я могу записать в м2м
вообщем трай кетч работает - большего и не требуется
27 апр 21, 09:20    [22314890]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
>там три сущности - первая это ящик- далее рассылка и третья M2M
=незачет. След топик начинай с DDL)))))
27 апр 21, 09:40    [22314899]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.
27 апр 21, 09:42    [22314902]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2337
asv79
орм то тут причем?

Притом, что ты пляшешь вокруг него с подпорками и приседаешь.
asv79
создание нового объекта

Ссылки ты хотел сказать? Нагружает процесс, да?
asv79
или мне может пойти к руководству и сказать

Да не надо тебе ничего менять, всё нормально. Ты же сам его выбрал и рассказываешь, какой он крутой.
27 апр 21, 10:23    [22314923]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
27 апр 21, 10:35    [22314934]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Basil A. Sidorov

Многопоточная вставка это то, что не надо делать с базой.

в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке
27 апр 21, 10:39    [22314938]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
эх джун.
Вставляем мастер с айди 123 и потом в детайль с этим же 123.
Ничего запрашивать не надо.
27 апр 21, 10:42    [22314939]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
Basil A. Sidorov

Многопоточная вставка это то, что не надо делать с базой.

в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке
для этого нужно 3 страницы?
Ты с работающей однопоточки начать должен был.
Потом тюнинг.
27 апр 21, 10:44    [22314940]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79
пропущено...

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
эх джун.
Вставляем мастер с айди 123 и потом в детайль с этим же 123.
Ничего запрашивать не надо.

ааа вот оно чо ,а айди то ты где возьмешь)
27 апр 21, 11:05    [22314952]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Выше писал. Счетчик на клиенте. Хоть до миллиарда. Потом вкл индекс PK
27 апр 21, 11:09    [22314954]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Есть куча решений. Но:
- ты не дал DDL
- ты слился
- ты не сделал однопоточку и не дал цифры
27 апр 21, 11:10    [22314956]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
Leonid Kudryavtsev
asv79
Но вот когда ты сталкиваешься с многопоточкой
Одна сессия вставили и НЕ закомитела
Это типа, прикол такой - наступать на элементарные грабли??? Или хочется как в анекдоте: "А вы на шкаф залезьте".
И даже если не касаться азов устройства СУБД, то задлянафига в сугубо последовательном процессе многопоточка? Чтобы оно сразу было и сразу глючило?
27 апр 21, 12:39    [22315012]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
asv79
в одном потоке слишком долго
Если вставка в два потока работает быстрее вставки в один поток, то, скорее всего, "ваш код - отстой".
27 апр 21, 12:43    [22315016]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов.

AFAIK
27 апр 21, 13:17    [22315040]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Leonid Kudryavtsev
Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов.

AFAIK
да.
Он просто не врубается, что в бд можно залить вообще без PK так как его нет в источнике данных!
27 апр 21, 13:46    [22315066]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
Leonid Kudryavtsev
Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов.

AFAIK
да.
Он просто не врубается, что в бд можно залить вообще без PK так как его нет в источнике данных!

естественно можно ,кто с этим спорит
там дальше идет табла которая многие ко многим- нука умник скажи как ее заполнить не имея id тех представлений - которые в нее пишутся)

петро ты как обычно наводишь суету с нулевым кпд - просто засоряя топики вокруг себя - почему тебя еще не удалили с форума - загадка,все меньше и меньше хочется сюда заходить из за тебя
27 апр 21, 14:41    [22315111]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Нафиг мне тебя обучать.
Будет DDL тогда посмотрим на твое поведение.
А так, тебе с джунов не вылезти н и к о г д а)
27 апр 21, 14:49    [22315121]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
Нафиг мне тебя обучать.
Будет DDL тогда посмотрим на твое поведение.
А так, тебе с джунов не вылезти н и к о г д а)

чему обучать - ты не знаешь вообще ничего - везде во всех темах тебя посылают на три буквы)))
учитель нашелся )
уж кто из нас джун - так это ты )
27 апр 21, 14:51    [22315124]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
А чего тогда слился уже 4ую тему про бд?
Тяжело задачу обрисовать?
27 апр 21, 14:54    [22315130]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Третья твоя тема 22310872
27 апр 21, 14:57    [22315136]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
ТС,
Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с)
27 апр 21, 15:07    [22315144]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Stanislav Bashkyrtsev

...
Может проверишь? Я вот проверил.

Да, был не прав.

INSERT при вставке в уникальный индекс блокирует запись. Блокировка будет висеть до тех пор, пока первый вставивший не сделает commit и только тогда придет exception.
27 апр 21, 15:18    [22315149]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Вообщем сделал через паралельные стримы задачу)
пошел путем декомпозиции сначала разбил монго на группы - группы на юзеров и далее уже миграция по каждому юзеру отдельно
это позволило мне вместо MongoCursor затягивать в память кусками данные из монго в виде списка и не уйти в ООМ
далее на откуп паралельному стриму
нигде нет конфликтов по записи- причем что я убрал все блоки трай кетч
работает достаточно быстро ,даже быстрей чем я ожидал

так что пока петро тут зубоскалил я таску закрыл)
27 апр 21, 15:56    [22315159]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
ТС,
Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с)

я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините
27 апр 21, 15:57    [22315161]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 2016
asv79
PetroNotC Sharp
ТС,
Если не будешь _давать_ когда попросят код\логи/стек\DDL, то останешься вечной нецелованной девочкой до старости" (с)

я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините

1) ну тут от тебя не всю структуру БД просят, а 2-3 связанные таблицы
2) Можно переименовать поля и таблицы + убрать поля, которые не затрагиваются в рамках того, что ты делаешь
27 апр 21, 19:13    [22315303]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Lelouch,
Разумеется. Я ему выше предложил два потока навстречу.
Понятно, если есть сущности, то можно навстречу по сущностям идти. Или параллельно.
Как был он джуном, так и останется.
27 апр 21, 19:21    [22315312]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
asv79
я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините
Нет, не извиним.
Если уж вы обсуждаете рабочие проблемы на публичном форуме, то будьте добры прикладывать минимально воспроизводимые примеры.
Не имеете права копипастить - постирайте пальчики о клавиши и набейте "такое же, но без перламутровых пуговиц".
27 апр 21, 19:23    [22315313]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Basil A. Sidorov
asv79
я ж те сказал уже по этому поводу - нельзя ,я под подпиской - не имею права ничего никуда выкладывать,поэтому извините
Нет, не извиним.
Если уж вы обсуждаете рабочие проблемы на публичном форуме, то будьте добры прикладывать минимально воспроизводимые примеры.
Не имеете права копипастить - постирайте пальчики о клавиши и набейте "такое же, но без перламутровых пуговиц".

к сожалению не имею права- а менять код целиком - я того рот шатал - лучше на стаке спросить
тут то толку набивать новый код руками - петро сразу придет - тему засрет - помощь будет дай бог от пары человек - поэтому однозначное нет коду на этом форуме ,учитывая что они сливают по запросу инфу о тебе
28 апр 21, 21:52    [22315987]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Java Ответить