Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 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

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

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

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

Откуда: СПб
Сообщений: 142
Если хочется просто закешировать пользователей, то можно обычную 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

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

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

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

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

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

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

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

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

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

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

Откуда: Тверь
Сообщений: 3329
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

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

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

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

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

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

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

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

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

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

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

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

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

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

Откуда: СПб
Сообщений: 142
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

Откуда:
Сообщений: 8257
Leonid Kudryavtsev,
ID шник пусть сам ставит. Простой счетчик.
Впрочем он DDL засекретил))
26 апр 21, 19:56    [22314712]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Java Ответить