C # несколько экземпляров одного и того же приложения читают / обновляют одну и ту же таблицу оракула, каждый процесс строки один раз - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу Windows-приложение в c # in. Net 4.5, чтобы выполнить следующие функции:

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

Это очень простой сценарий для одного экземпляра.У нас огромные объемы данных в нашей базе данных (более 30 миллионов), поэтому мы планируем запускать несколько экземпляров приложений на разных серверах.

Мне нужна помощь, чтобы использовать правильный подход при чтении / обновлении уникальной записи, а такжев нескольких потоках с несколькими экземплярами.

1 Ответ

0 голосов
/ 19 сентября 2019

Я бы реализовал что-то вроде этого:

  1. Добавьте три столбца: datetime Started, datetime Finished и строка Token.Столбцы Started и Token должны быть установлены, когда запись была выбрана для обработки.Столбец Finished должен быть установлен после обработки записи.
  2. Каждый экземпляр приложения выполняет следующие шаги:

    • var token = $"{ServerName}_{Guid.NewGuid().ToString()}"; // id итерации, вам следует это сделатьдля каждого выбора
    • пометить записи: update records set Token = @token, Started = @now where id in (select top 10 id from records where Started is null)
    • , затем выбрать записи: select * from records where Token = @token
    • обработать записи
    • пометить записи как завершенные: update records set Finished = @now where Token = @token

В фоновом режиме вы должны обработать случай, когда экземпляр приложения выбирает запись и происходит сбой до завершения обработки: update records set Started = null where Finished is null and Started > Started + @some_timeout

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...