Size: a a a

2020 July 15

nn

nasdaq nice in pro.jvm
Yury Golikov
А почему ты считаешь, что раунд робин тут лучше, чем проверять есть ли уже очередь для задач юзера и в итоге класть задачи в общую очередь?
вот так даж лучше будет
мапа просто в голову первая прилетела
источник

YG

Yury Golikov in pro.jvm
Alexey Genus
С мапой плохо. Вот так лучше.
С одной стороны складываем задачи в очередь.

С другой стороны делаем один рабочий поток и несколько однопоточных тред-пулов.

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

Таким образом и потоков мало, и сохраняется порядок для каждого пользователя при контролируемом количестве потоков.
Интересно - да. Те разбиваем потоки  на партиции по userID. И условно поток 1 всегда обрабатывает айди с 1 по 1000
источник

YG

Yury Golikov in pro.jvm
Но это и есть мапа, просто мапа потоков с хешом по userID получается?
источник

YG

Yury Golikov in pro.jvm
Спасибо всем!)
источник

nn

nasdaq nice in pro.jvm
Yury Golikov
Интересно - да. Те разбиваем потоки  на партиции по userID. И условно поток 1 всегда обрабатывает айди с 1 по 1000
не совсем
тут распределение по хешу гарантирует что один поток ВСЕГДА будет работать с id с которым ни один другой поток не работал
а то что тредПул однопоточный - гарантирует синхронное выполнение твоих задач
источник

nn

nasdaq nice in pro.jvm
то есть тут как бы ID мапятся в потоки
источник

nn

nasdaq nice in pro.jvm
и никаких локов
К Р А С И В О
источник

YG

Yury Golikov in pro.jvm
nasdaq nice
не совсем
тут распределение по хешу гарантирует что один поток ВСЕГДА будет работать с id с которым ни один другой поток не работал
а то что тредПул однопоточный - гарантирует синхронное выполнение твоих задач
Ну да я это и имел ввиду, ток криво написал)
источник

AE

Alexandr Emelyanov in pro.jvm
@dmsol получилось с getSQL(ParamType.NAMED), он генерит :1, :2
источник

D

Dima in pro.jvm
Alexandr Emelyanov
@dmsol получилось с getSQL(ParamType.NAMED), он генерит :1, :2
дальше .replaceAll(«\\:», «\\$») ?
источник

AE

Alexandr Emelyanov in pro.jvm
Dima
дальше .replaceAll(«\\:», «\\$») ?
не, ща гист покажу
источник

AE

Alexandr Emelyanov in pro.jvm
Dima
дальше .replaceAll(«\\:», «\\$») ?
немного громоздко, но апи годное, можно поверх интеграцию накатать https://gist.github.com/lex-em/362436f10712d3ab75947a6a97eead91
источник

D

Dima in pro.jvm
Alexandr Emelyanov
немного громоздко, но апи годное, можно поверх интеграцию накатать https://gist.github.com/lex-em/362436f10712d3ab75947a6a97eead91
не понял код
источник

D

Dima in pro.jvm
ты делаешь execute, но bind values не подставляешь
источник

D

Dima in pro.jvm
это как?
источник

AE

Alexandr Emelyanov in pro.jvm
@dmsol с 33 строкой бодался, думал что bind - обычный билдер, который меняет состояние и возвращает себя же, а нет - он таки самая настоящая цепочка, возвращает новый экзепляр на каждый вызов
источник

AE

Alexandr Emelyanov in pro.jvm
Dima
ты делаешь execute, но bind values не подставляешь
33 строка
источник

AE

Alexandr Emelyanov in pro.jvm
i+1 ибо индекс списка с нуля, индекс параметров с 1
источник

D

Dima in pro.jvm
погоди
источник

D

Dima in pro.jvm
val sql = query.getSQL(ParamType.NAMED) - это вернет запрос с :1, :2
источник