Нужен совет по реализации многопоточного приложения

darlov
Дата: 13.05.2014 11:39:15
Доброго времени суток, не хватает познаний в реализации.
Имеется программа которая многопоточно опрашивает серверы, необходимо эти данные складывать в массив или в коллекцию для дальнейшей вставки в БД. Как лучше реализовать вставку всех данных с разных потоков в один массив и потом из массива в БД, ведь пока будет идти запрос вставки в БД, массив будет заполнятся.
Заранее благодарен.
Arm79
Дата: 13.05.2014 12:15:48
ConcurrentQueue
Алексей К
Дата: 13.05.2014 15:32:55
Может проще вставлять из "много потоков" сразу в БД?
darlov
Дата: 14.05.2014 05:56:35
За ConcurrentQueue спасибо, не знал....
Алексей К
Может проще вставлять из "много потоков" сразу в БД?

В таком случае буду тормозить потоки с данными или есть иной способ?
Работаю с PostgreSQL
Кифирчик
Дата: 14.05.2014 09:36:24
darlov,
основная очередь - А
у каждого потока своя небольшая очередь - Б
потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) -
поток пробует захватить локер очереди А, и быстренько сливает туда n записей.

другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных.
darlov
Дата: 14.05.2014 09:45:17
Кифирчик
darlov,
основная очередь - А
у каждого потока своя небольшая очередь - Б
потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) -
поток пробует захватить локер очереди А, и быстренько сливает туда n записей.

другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных.

А чем плох ConcurrentQueue?
Каждый поток заполняет общий ConcurrentQueue методом Enqueue, а отдельный поток забирает оттуда методом TryDequeue (удаляя старые записи) и вставляет в БД оператором COPY
Алексей К
Дата: 14.05.2014 09:57:50
darlov
В таком случае буду тормозить потоки с данными
В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ?
Кифирчик
Дата: 14.05.2014 10:16:13
darlov
...А чем плох ConcurrentQueue?...

я не говорю что он плох, лично руками ConcurrentQueue "не трогал", и её комментировать не могу )
Где-то в степи
Дата: 14.05.2014 10:28:18
darlov
В таком случае буду тормозить потоки с данными

Рассматривайте поток как единицу работы.
Алексей К
В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ?

Имхо, слоны раньше сдохнут - чем куча иссякнет..
ЕвгенийВ
Дата: 14.05.2014 11:03:20
darlov,
используемый провайдер поддерживаем для XXXCommand методы Begin/EndExecuteNonQuery?