Диссертация (1152184), страница 29
Текст из файла (страница 29)
Интерпретатор mono позволяет вести разработку наC#, при этом доступны классы работы с СУБД MS SQL и MySQL. СКУДпредприятия пищевой промышленности, реализованная в распределеннойархитектуре, позволяет получить информацию, необходимую для принятиярешения о допуске, двумя способами.В первом случае запрос делается к центральной СУБД КИС предприятия, вовтором случае – к локальной СУБД микрокомпьютера. Информация, находящаясяв центральной БД актуальна по определению, для обеспечения актуальности173локальной базы данных необходимо определиться с периодичностью ееактуализации. Локальная БД, как было ранее отмечено, используется только вслучае аварий, либо большой загрузки центрального сервера, и именно поэтомуавтор диссертации и его коллеги остановились на ночной выгрузке, когда нагрузкана инфраструктуру минимальна.
При запросе информации с центрального серверана получение ответа выделяется одна секунда, после этого текущий запросотменяется и делается еще один к локальной СУБД. Очевидно, что не имеет смысладелать запрос к центральной СУБД, если она в данный момент по каким-либопричинам недоступна.Специфика класса SqlConnection в C# такова, что возможность быстропроверить открытый экземпляр соединения на доступность отсутствует. В случае,например, физических проблем с сетью возможна большая задержка (определяемаяпараметром «Connection timeout») до получения обрабатываемого исключения.
Вкачестверешенияданнойпроблемыавторомдиссертациипредложеноиспользовать опрос центральной СУБД в отдельном потоке с периодичностью трисекунды. Для опроса используется конструкция, в которой в открытом соединениик целевой БД выполняется команда «select 1». Данный запрос целесообразновыполнятьприпомощиметода«SqlCommand.ExecuteScalar».Результатзаписывается в глобальную переменную, доступную за пределами потока. Вдальнейшем в основной программе, в зависимости от значения этой переменной,запрос информации для принятия решения о допуске делается либо к центральнойСУБД, либо сразу, минуя ее, к локальной СУБД микрокомпьютера.Задача поддержания локальной базы данных в актуальном состоянии весьмаосложняется вследствие использования различных СУБД – MS SQL и MySQL,развернутых к тому же на операционных системах Windows Server 2016 и UbuntuLinux16.04.2LTS.ОрганизациявзаимодействиямеждуСУБДчерезпромежуточные сервисы приведет в итоге к сложному в отладке решению с низкимбыстродействием, ограниченно поддерживающему распределенные транзакции.Для решения этой проблемы был использован механизм связанных серверов(Linked servers) на стороне MS SQL Server.
Данный механизм позволяет174использовать объекты внешних СУБД (в том числе MySQL, развернутого наUbuntu Linux 12.04.2 LTS) в sql-запросах с поддержкой функционалараспределенных транзакций.В приложении А дан пример создания связанного сервера MySQL.Операционная система с MS SQL Server должна содержать соответствующийдрайвер, который устанавливается согласно документации [127]. На данныймомент доступна версия 5.3.Использование связанных серверов существенно повышает скорость иудобство взаимодействия с MySQL Server контроллера из контекста центральногоMS SQL Server. Однако возникает вопрос о выборе способа записи результатазапроса к центральной СУБД в таблицу локальной СУБД.
Использование, казалосьбы, логичной конструкции «insert into _mySQL (select _data from _msSQL)»приводит к резкому падению быстродействия. При помощи профайлера былоустановлено, что при таком способе записи передаются на локальный сервер поодной, и для каждой из них выполняется свой запрос на insert. Вероятно, этосвязано с реализацией драйвера или алгоритма в целом.Более того, при записи данных с центрального сервера на локальныйнеобходимо выполнить несколько условий.
Согласно представленному нарисунке 47 алгоритму, при записи необходимо выполнить два действия. Сначалапри помощи команды upsert добавить или обновить существующие записи офизических лицах на локальном сервере. Затем необходимо удалить с локальногосервера записи, которые отсутствуют в наборе данных, сформированных наосновном сервере. Команда upsert, присутствующая в MySQL Server, в данномслучае является очень функциональной и экономит, по крайней мере, однуоперацию.Операция синхронизации локальных баз данных оформлена в виде задания вMS SQL Server Agent.В период недоступности основного сервера контроллер используетинформацию из локальной базы данных, в этой же базе находится таблица журнала175проходов.
Как только основной сервер становится доступен, происходит (потриггеру) выгрузка журнала событий в центральную базу данных.declare @currentGate varchar(255) – текущая проходнаяdeclare @currentControllerIPAddress varchar(255) - текущий связанный серверdeclare @Controllers table (ipAddress varchar(255), gateName varchar(255), gateType int)insert into @Controllers (ipAddress, gateName, gateType) values ('[23]', 'Производственный корпус', 2)insert into @Controllers (ipAddress, gateName, gateType) values ('[45]', 'Административный корпус',1)insert into @Controllers (ipAddress, gateName, gateType) values ('[111]', 'Помещение', 5)declare Gates CURSOR FOR select distinct gateName from @Controllersopen Gatesfetch next from Gates into @currentGateОбъявление переменных, втом числе данных оконтроллерах (связанныхсерверах)@@FETCH_STATUS = 0fetch next from Gatesinto @currentGateПолучение следующейзаписиgateType =ПроизводственныйкорпусПроживающие,директивныеразрешенияНетНетДаОбъявление курсорапроходных, открытиекурсора, получениеследующей записиОкончание процесса,запись в журнал событийТип проходнойgateType =ПроизводственноепомещениеgateType =(электронныйАдмини стративн ыйзамок)корп усОбучающиеся,работники,директивныеразрешенияgateType =Административноепомещение(электронныйзамок)Временные окнарасписания занятийДирективныеразрешенияДирективныеразрешенияПреобразуем таблицув строку дляпоследующей записи вконтроллерselect(',(' + cast(HumanId AS varchar) + ', ' + cast(KeyNumber AS varchar) + ', "' + Fio + '", "' + comment +'", '+cast(allow AS varchar) + ')')from @myResfor xml path('')declare ControllerIPAddresses CURSOR FOR select ipAddress from @Controllers where gateName = @currentGateopen ControllerIPAddressesfetch next from ControllerIPAddresses into @currentControllerIPAddress@@FETCH_STATUS = 0Запись в контроллеркомандой upsert, удалениес контроллера записей,отсутствующих нацентральном сервереОбъявление курсораконтроллеров для текущейпроходной, открытиекурсора, получениеследующей записиДаBEGIN TRYdeclare @query1 varchar(max) = 'exec (''delete LOW_PRIORITY from key_numbers where HumanId not in (' +@sqlD + ')'') at ' + @currentControllerIPAddressexec (@query1)declare @query2 varchar(max) = 'exec (''insert LOW_PRIORITY into key_numbers (HumanId, keynumber, fio,comment ,allow) values ' + @sql + ' on duplicate key updatekeynumber=values(keynumber),fio=values(fio), comment=values(comment), allow=values(allow)'') at ' +@currentControllerIPAddressexec (@query2)END TRYBEGIN CATCHselect 'Ошибка', @currentGate as Проходная, @currentControllerIPAddress as КонтроллерEND CATCHfetch next from ControllerIPAddresses into @currentControllerIPAddressРисунок 47 – Алгоритм синхронизации центральной базы данных с MySQL176При помощи этого механизма обеспечивается достоверность отчетов,основанных на журнале событий основного сервера.
Пример такого отчетаприведен на рисунке 48.4500Количество уникальных входов4000350030002500200015001000500012 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10Даты, январь-февраль 2015Корпус 1Корпус 2Корпус 3Рисунок 48 – Пример отчета по проходам в здания организацииСКУД разрабатывалась с учетом требований ГОСТ Р 51241-2008 [34] и, взависимостиотреализациинатомилииномпредприятиипищевойпромышленности, может быть отнесена к универсальным системамбольшойемкости второго или третьего класса по функциональным возможностям. СКУД несодержит в своем составе хранилища для персональных данных, используетсяцентральная СУБД ИАСУ.1774.3 Реализация и внедрение интегрированнойавтоматизированной системы управленияООО«РИФ»являетсярыбоперерабатывающимосуществляетсяуправленческихтерриториально-распределеннымпредприятием.централизовано,решенийдлянеобходимоУправлениепредприятиемобоснованностипринимаемыхприменениесистемыкомплекснойавтоматизации.
ИАСУ, как платформа комплексной автоматизации, должнаоперировать полной, достоверной и актуальной информацией. Так сложилосьисторически, что во многих случаях ввод в ИАСУ информации на различныхэтапах технологических процессов осуществлялся вручную. На выполнениерегистрации фактов уходит много времени, работники производства отвлекаютсяот непосредственного технологического процесса, вследствие ошибок информацияможет попасть в ИАСУ в искаженном виде. В связи с этим при интеграции ИАСУс экземплярами ПАК автоматизации были подробно проработаны механизмысбора необходимой информации в режиме реального времени. Это позволилозначительно повысить эффективность процессов и качество управленческихрешений, принимаемых на основании агрегированной в ИАСУ информации сразличных участков (и территорий) производства.Экземпляры ПАК параллельно с управлением процессами предоставляютИАСУсвязаннуюснимиинформацию.Информацияжурналируется,соответствующие операции рассматриваются как регистрации фактов.