Буферизация изменений

tanya
Сообщения: 21
Зарегистрирован: 03 дек 2019, 13:02

Буферизация изменений

Сообщение tanya » 03 дек 2019, 17:37

В целях обеспечение консистентности и непротиворечивости данных при зависании одного из SQL-серверов (как MSSQL так и Oracle сервера), необходимо модификацию данных на серверах делать не прямо, а через специальные команды, описанные ниже для SQL серверов. Общая идея - вначале необходимо в каталоге Buffer (в подкаталоге, где находится sarmat_timer.exe) в соотв. xml файле (или текстовом, как удобней) сформировать буфер выполнения обновлений, и, по мере его исполнения, помечать как выполненные определенные пункты.

В случае разрыва связи с сервером (или с MSSQL, или с Oracle), sarmat_timer должен тут же преркатить свою работу с выводом соотв. сообщения об ошибке (при этом таймер в самом sarmat_timer должен остановиться - и больше не выполнять никаких обращений ни к сканерам, ни к Oracle, ни к MSSQL серверу).

При загрузке sarmat_timer:
  • если Oracle или MSSQL сервер недоступен, то вываливаться из программы с сообщением об ошибке, сам таймер не запускать;
  • если SQL-сервера доступны, то необходимо перед началом выполнения задач по таймеру (в т.ч. опросов сканеров) проверить буфер - а нет ли незаконченных команд по обновлению информации, оставшихся по причине подвисания одного из серверов. И если таковые имеются, то аккуратно и последовательно выполнить все команды такого буфера.
Виды команд для SQL-серверов:
  • «RunOracleSQL» - выполняет SQL-запрос (или несколько запросов) на обновление к Oracle SQL серверу. Параметром служит просто строка Oracle SQL-запроса;
  • «RunMSSQL» - выполняет SQL-запрос (или несколько запросов) на обновление к MSSQL серверу. Параметром служит просто строка MSSQL-запроса;
  • «RefreshMSSQLContainer» - обновляет в MSSQL из Oracle информацию о контейнере. В качестве параметра передается штрих-код контейнера.
  • «UpdateMSSQLFromOracle» - обновляет данные в таблице MSSQL по запросу из Oracle-сервера. Два параметра:
    • строка sql-запроса к Oracle-серверу. Например «select state from sarmat.command_gas where id=678»
    • строка MSSQL-запроса обновления, которая в своем составе использует подстановки = номеру столбца из предыдущего SQL-запроса к Oracle. Например, «Update dbo.ask_rec set state=$01$ where id=456» - подразумевается, что нужно присвоить полю state в таблице asc_rec с соотв. ID значение, полученное из предыдущего Oracle запроса.

tanya
Сообщения: 21
Зарегистрирован: 03 дек 2019, 13:02

Протоколирование команд буфера

Сообщение tanya » 03 дек 2019, 17:39

При выполнении команд буфера при нормальном ходе работы (SQL-сервера не подвисают), обязательным будет везде писать после префикса смысла лога постфикс BUF. Например:
  • «16:59:56.656 - DFCT BUF - Update AP2 w 456 set ask_state=2»
  • «16:59:56.656 - DFCT BUF - Order.Container.Content.Deficit successfully executed, id=7»
  • «16:10:27.171 + BOX BUF 00010324 - updating ask_rec.id 123: cell_name=001L175»
Когда же буферные команды выполняются при пуске sarmat_timer после предыдущего зависания одного из SQL-серверов, то логи оформляются следующим образом (в самом начале пишется префикс «B», внутри постфикс «BUF» также пишется):
  • «16:59:56.656 B - DFCT BUF - Update AP2 w 456 set ask_state=2»
  • «16:59:56.656 B - DFCT BUF - Order.Container.Content.Deficit successfully executed, id=7»
  • «16:10:27.171 B + BOX BUF 00010324 - updating ask_rec.id 123: cell_name=001L175»


Вернуться в «АСК ЭТМ»