Я бы порекомендовал вам следующие подходы, выраженные в псевдокоде:
Первый подход:
For each remote service polling
start transaction
if the number of rows < bulk copy threshold
send all inserts in single batch
otherwise
bulk copy rows
end if
commit transaction
end for
Порог массового копирования - это количество строк, из которых более эффективно использовать массовое копирование, чем пакет вставок.
для массового копирования строк существует специальный класс SqlBulkCopy , который является наиболее эффективным при вставке большого количества строк.
Если первый подход не может обработать большое количество поступающих строк, вы можете использовать следующий второй подход.
loop
while (batch.rows < batch size) and (time elapsed since last bulk copy < batch interval)
add rows to batch from web service
end while
start transaction
bulk copy batch
commit transaction
clear batch
end loop
размер пакета и интервал пакета - числа, которые вам необходимо настроить.
Первый подход дает вам наименьшую задержку. Как только данные получены из удаленной веб-службы, они вставляются на SQL Сервер. Но может случиться так, что он не может обработать большое количество строк.
Второй подход имеет большую задержку, однако он может обрабатывать гораздо больше строк.
Второй подход можно улучшить. Вместо ожидания заполнения пакета или истечения интервала для отправки данных на сервер SQL вы можете непрерывно отправлять строки в SqlBulkCopy. Это может быть достигнуто путем реализации IDataReader из удаленного опроса сервиса. У DataReader будет внутренний буфер (очередь), заполненный с момента последнего вызова удаленной веб-службы. По истечении интервала или достижении размера пакета и отсутствии строк в очереди DataReader.Read () возвращает false. Если в очереди больше нет строк, но интервал не истек или размер пакета не достигнут, DataReader снова вызывает удаленную веб-службу для заполнения внутренней очереди.
Это уточнение имеет некоторые преимущества:
- Потребляйте гораздо меньше памяти. Вам не нужно хранить весь пакет в памяти, только внутреннюю очередь, всего несколько строк.
- Он отправляет строки на SQL Сервер по мере их поступления. Вам не нужно ждать, чтобы заполнить пакет, чтобы отправить его на SQL сервер.
- Он может обрабатывать больше строк в секунду.