|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Всем привет! Получаю объекты из очереди ActiveMQ через MessageListener onMessage. Сообщения накапливаются в ArrayList objectList. При первом запуске onMessage запускается ScheduledExecutorService executorFlushSchedule. И по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList. Получается общий ресурс objectList и 2 потока: метод onMessage и executorFlushSchedule. Как в данном случае правильно поставить блокировку на objectList? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2019, 18:07 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Molasar, 1) ReentrantLock тут не нужен 2) Необходима синхронизация при создании ScheduledExecutor (да и вообще - погуглите про double-checked locking) 3) Проще всего - обернуть List с помощью Collections.synchronizedList(), но я бы посмотрел в сторону реализаций BlockingQueue (add/offer для добавления, drainTo для получения записей для вставки) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2019, 18:17 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
почему ReentrantLock? Вообще самый простой способ - это обернуть все обращения к objectList в synchronised блок ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2019, 18:21 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Lelouch3) Проще всего - обернуть List с помощью Collections.synchronizedList() P.S. Правда в этом случае есть подводные камни (например, нельзя использовать итератор), поэтому лучше или BlockingQueue или блоки синхронизации, как написали выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2019, 18:59 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
блокингкью для таких целей юзают. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2019, 19:26 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Спасибо, бум думать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 10:01 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Зачем ему еще одна queue? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 10:41 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
maytonЗачем ему еще одна queue? это типа буфера, видимо, для bulk insert в базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 14:58 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
ОзверинmaytonЗачем ему еще одна queue? это типа буфера, видимо, для bulk insert в базу.имхо лишнее. BlockingQueue читает вставляющий поток и вставляет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:04 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Архитектурно не вижу смысла. У кого есть строгое объяснение зачем нужна 2-я очередь - отпишитесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:18 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
И по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList. Не очень понятно, зачем вообще блокировка: 1. Заполняем ArrayList в потоке читателе-ActiveMQ 2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу 3. Создаем новый ArrayList Но. возможно, я просто чего-то не понимаю IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:25 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevИ по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList. Не очень понятно, зачем вообще блокировка: 1. Заполняем ArrayList в потоке читателе-ActiveMQ 2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу 3. Создаем новый ArrayList Но. возможно, я просто чего-то не понимаю IMHO мое мнение такое, что : - тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности - тс использует надежное хранилище для сообщений - тс вдруг хранит сообщения в arraylist, где может их потерять Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился.... И все - 10000 событий исчезли и никто о них не узнает... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:33 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Вот этот пункт непонятен. Сообщения накапливаются в ArrayList objectList. Накапливаются для чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:39 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Если о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й. Так как очередь вероятно никто не выгребает. .. Тут как обычно всез собак вешают на слабое место. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:39 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
PetroNotC SharpЕсли о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й. Так как очередь вероятно никто не выгребает. AFAIK Нормальные люди (не создатели Java), для этого используют Circle Ring Buffer. Но создатели Java, не позаботились реализовать его в java.util ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 16:54 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevPetroNotC SharpЕсли о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й. Так как очередь вероятно никто не выгребает. AFAIK Нормальные люди (не создатели Java), для этого используют Circle Ring Buffer. Но создатели Java, не позаботились реализовать его в java.util ((( Подобное реализовано в библиотеке Disruptor. И уже например используется в асинхронных логгерах Log4j2 при правильной настройке. Но я сомневаюсь что автору это нужно. Дизраптор создавался для высокочастотного трейдинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 17:32 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Озверинмое мнение такое, что : - тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности - тс использует надежное хранилище для сообщений - тс вдруг хранит сообщения в arraylist, где может их потерять Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился.... И все - 10000 событий исчезли и никто о них не узнает... вроде все понятно: у ТС spring-jms, который вычитывает сообщения по одному и отдает их в обработку, в связи с чем у ТС проблемы с производительностью (наверное просадка порядками исчисляется), поэтому он принял решение, что в базу их нужно вливать батчами, здесь очевидно, что задача не так решается: нужно батчами читать и батчами писать, а не изворачиваться хранением в памяти и потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 18:17 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Molasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место. Возможно - это предположение на основе его прошлых постов? В любом случе нужны хоть какие-то цифры. И хотя-бы 2 эксперимента. Чтение просто сообщений из ActiveMQ без записи в БД. И наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 18:56 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
maytonMolasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место. Возможно - это предположение на основе его прошлых постов? Как ускорить запись в таблицу через JDBC? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 19:07 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Да я помню это. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 19:08 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Molasar, в классе: Код: java 1.
при добавлении: Код: java 1.
при записи в БД: Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 19:17 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
ой нет, фигню написал ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2019, 19:28 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
Андрей ПанфиловmaytonMolasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место. Возможно - это предположение на основе его прошлых постов? Как ускорить запись в таблицу через JDBC? Я помню. Выложу цифры чуть позже. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2019, 14:51 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
ОзверинLeonid Kudryavtsevпропущено... Не очень понятно, зачем вообще блокировка: 1. Заполняем ArrayList в потоке читателе-ActiveMQ 2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу 3. Создаем новый ArrayList Но. возможно, я просто чего-то не понимаю IMHO мое мнение такое, что : - тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности - тс использует надежное хранилище для сообщений - тс вдруг хранит сообщения в arraylist, где может их потерять Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился.... И все - 10000 событий исчезли и никто о них не узнает... Логика следующая: 1. Приложения кидают сообщения в очередь ActiveMQ 2. Слушатель ActiveMQ считывает сообщения по одному из очереди. 3. Если писать в базу по одному сообщению, то получается очень медленно. Поэтому приходится накапливать сообщения в списке и сбрасывать их по таймеру в БД как пакет Производительность увеличивается на порядок. 4. До комита в БД ловим эксепшены и возвращаем все сообщения в очередь. А как по другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2019, 14:59 |
|
Как работает ReentrantLock?
|
|||
---|---|---|---|
#18+
MolasarЕсли писать в базу по одному сообщению, то получается очень медленно. Поэтому приходится накапливать сообщения в списке и сбрасывать их по таймеру в БД как пакет Производительность увеличивается на порядок.для пакетной записи не нужен таймер ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2019, 15:24 |
|
|
start [/forum/search_topic.php?author=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA-%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B5%D1%86&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 2010ms |
total: | 2315ms |
0 / 0 |