Распараллеливание операций записи в базу данныхC#

Место общения программистов C#
Ответить
Anonymous
 Распараллеливание операций записи в базу данных

Сообщение Anonymous »

Я хотел повысить эффективность времени загрузки с помощью TPL Dataflow.
Я получаю файлы с несколькими строками. Я анализирую и загружаю их в базу данных. У меня есть два блока потока данных:

Получить и проанализировать файл со строками
|
V
Вставить в базу данных в FileTable, RowTable

При использовании двух блоков потока данных время немного улучшилось. Теперь я хотел еще улучшить и добавить DOP (степень параллелизма) >= 1. Это было возможно в первом блоке, поскольку он анализировал несколько файлов параллельно.

Во втором блоке я попал в контекст EF Db проблемы. Потоки пытались вставить данные в базу данных одновременно.

Entity Framework Core: вторая операция началась в этом контексте до завершения предыдущей операции.


ParseFilesBlock - DOP >= 1 (ОК)

InsertToDatabaseBlock - DOP >= 1 (ошибки контекста БД, возможные конфликты между связанными данными)

Основываясь на официальной документации, вам необходимо предоставить каждому потоку ограниченный контекст базы данных и получить сервисы.
Однако в итоге я получил услуги всеми способами:

Код: Выделить всё

void MyMethod1() {
var service1 = IServiceProvider.GetRequiredService();
...
}
Мне пришлось написать это слишком многими методами. Все общедоступные и частные методы, используемые функцией загрузки, использующей поток данных, получают от 1 до 7 сервисов. А если один метод использовался другим API, все было еще более подвержено ошибкам, поскольку для этого все равно требовалась область переноса.
  • Мне неоднократно говорили, что существуют нет преимуществ при распараллеливании операций обновления/вставки базы данных. База данных создает блокировки для обеспечения целостности данных, имеет ограничения на соединения, конфликты и т. д.
  • мой InsertToDatabaseBlock использует транзакции EF, и над файлом и его файлом выполняется несколько операций вставки/обновления. содержание. В нескольких файлах могут быть данные, связанные друг с другом (строка помечается как завершенная на основе содержимого из нескольких файлов), и тогда несколько потоков могут создавать противоречивые данные.
Должен ли я рассмотреть что-то другое для сокращения времени загрузки вместо DOP>=1 для InsertToDatabaseBlock? Например: Массовые обновления.
Операции записи в БД настолько проблематичны при распараллеливании, что их всегда следует избегать?

Подробнее здесь: https://stackoverflow.com/questions/793 ... operations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»