Прежде чем начать обзор возможных способов взаимодействия внешних приложений с СУБД Caché, необходимо вкратце рассмотреть организацию самой СУБД.
Рисунок 1
Сердцем СУБД Caché является сервер многомерных данных (MDS - Multidimensional
Data Server), позволяющий компактно и эффективно хранить данные произвольной
сложности. Для доступа к сложноструктурированным данным не требуется производить
изощренных и дорогостоящих операций соединения, что положительно сказывается
на общей производительности, и, в совокупности с транзакционной многомерной
моделью Caché и встроенными средствами многопользовательской работы, позволяет
создавать промышленные приложения, лишенные недостатков реляционных СУБД.
В Caché реализована концепция единой архитектуры данных. К одним и тем же
данным, хранящимся под управлением сервера многомерных данных Caché существует
три способа доступа: прямой, объектный и реляционный. Прямой доступ к данным(Caché Direct),
обеспечивает максимальную производительность. Разработчики
приложений получают непосредственный доступ к многомерным структурам (так называемым
глобалам) Caché, что позволяет при достаточной квалификации создавать высокопроизводительные
решения. Для построения отчетов и совместимости с реляционными продуктами СУБД
Caché предоставляет реляционный доступ, в основе которого лежит стандарт SQL
92. Однако, наиболее интересным является объектный доступ. С этой точки зрения
Caché соединяет традиционную технологию проектирования баз данных с объектной
моделью. Применение такого подхода оказывается достаточно полезным в CAD/CAE ,
CASE -технологиях и других областях, где приходится манипулировать значительными
объемами данных с разнообразным семантическим содержанием. Более того, объектная
модель Caché гарантирует согласованное объединение данных и бизнес-логики,
что в реляционных системах обеспечивается сложной системой триггеров, которые
изначально разделяют систему на «логику» и на «данные».
СУБД Caché является открытой системой и предоставляет огромное количество
интерфейсов для взаимодействия с внешним миром, которые можно разделить по
типу доступа: прямой, реляционный и объектный. Однако, стоит отметить, что
подобное разбиение довольно условно, и некоторые способы взаимодействия Caché
с внешним миром можно отнести сразу к нескольким категориям.
Чаще всего для создания GUI -приложений в среде Windows используется механизм
объектной фабрики Caché, в основе которой лежит Caché ObjectServer, представляющий
собой OLE In - Process Automation Server. Он позволяет держать на клиенте
копии серверных объектов. Иначе говоря, если в приложении на VB средствами
ObjectServer открывается объект, то идентичный объект открывается и на сервере.
При изменении какого-либо свойства на стороне клиента соответствующее свойство
у серверного объекта изменяется автоматически, вызов метода влечет его выполнение
на сервере с передачей результатов на клиентскую часть
Архитектура ObjectServer подразумевает разделение приложения на две основные
части: клиентскую и серверную. И здесь сразу же возникает вопрос: каким образом
клиент будет получать метаданные серверных объектов? Существует два возможных
подхода: раннее и позднее связывание. Раннее связывание означает, что на клиенте
явно хранятся определения классов. Т.е. если клиент взаимодействует с серверным
классом, то приложению заранее известна структура этого класса, описания свойств
и сигнатуры методов, благодаря чему при компиляции можно создавать более эффективные
способы обращения к экземплярам данного класса. Если с сервером связано более
одного клиента, то, естественно, информацию о серверных классах необходимо
продублировать на каждом клиенте, что в случае сильно распределенной системы
может быть довольно трудоемко. Однако, основной недостаток такого подхода заключается
в синхронизации изменений серверных классов с соответствующими определениями
на клиентах. При изменении одного свойства необходимо провести корректировку
и перекомпиляцию всех классов, которых потенциально могут быть тысячи и даже
сотни тысяч.
Альтернативой раннему связыванию является использование механизма позднего связывания.
Все что клиенту необходимо иметь, так это единственный класс Factory , который
согласно паттерну проектирования Abstract Factory , берет на себя ответственность
за создание объектов, инкапсулируя всю логику формирования экземпляров класса
на стороне клиента. В совокупности с преимуществами технологии OLE ( а именно,
при использовании Variant ) объектная фабрика избавляет клиента от необходимости
хранить определения всех используемых серверных классов.
Dim Factory As CacheObject.Factory
Set Factory = CreateObject("CacheObject.Factory")
If Not Cache.Connect("cn_iptcp:127.0.0.1[1972]:TEST") Then
MsgBox "Cannot connect to Cache"
End
End If
Dim Dog As Object
Set Dog = Factory.New("Dog")
Dog.Name = "Tuzik"
Dog.sys_Save
Листинг 1 Использование Factory в VB
Как уже говорилось выше, механизм Caché ObjectFactory используется для создания
GUI -приложений исключительно в среде Windows. При создании же кросс-платформенных
решений разработчики зачастую используют технологию Java, которая также очень
легко интегрируется с СУБД Caché с помощью таких механизмов как Caché Java
Binding, Caché EJB Binding и относящийся к реляционному способу доступа JDBC
-драйвер, поддерживающий JDBC API 2.0.
Механизм Caché Java Binding позволяет Java -объектам взаимодействовать с
серверными объектами Caché напрямую и для каждого указанного класса Caché
создает специальный промежуточный Java -класс, который функционирует непосредственно
в среде Java и обеспечивает доступ к свойствам и методам серверных объектов.
В модели объектного проецирования Java Binding можно выделить следующие основные
элементы:
Caché Java Class Generator –
специальное расширение компилятора классов Caché, позволяющее из описаний
классов в Caché Class Dictionary получать описания классов на Java
Caché Java Class Package –
Набор Java-классов, которые в связке с классами, сгенерированными Caché Java
Class Generator, обеспечивают прозрачную работу с объектами, сохраненными
на сервере Caché
Caché Object Server – специальный
серверный процесс, обеспечивающий взаимодействие между Java -клиентом и сервером
Cach e через транспортный протокол TCP/IP.
Таким образом, Caché Java Class Generator из определений классов Caché создает
Java-проекции, которые во время выполнения взаимодействуют с соответствующими
классами на сервере Caché. Общая схема взаимодействия приведена на рисунке 2
Рисунок 2
Как уже было сказано, Caché Java Binding не является единственным способом
доступа к Caché из Java. Существует еще механизм EJB Binding, позволяющий
EJB-компонентам взаимодействовать с серверными объектами. Аналогично механизму
Java Binding, EJB Binding автоматически создает для каждого указанного класса
EJB Entity bean, хранящийся и исполняющийся непосредственно на сервере Caché,
что дает следующие преимущества:
- Отсутствие объектно-реляционного несоответствия. Благодаря тому
что Caché естественным образом работает с объектами, не требуется проводить
дорогостоящие объектно-реляционные преобразования.
- Быстрая разработка. СУБД Caché автоматизирует операции, связанные
с генерацией EJB -компонентов, созданием скриптов для развертывания и тестирования
компонент.
- Гибкость. Внутри EJB -компоненты можно использовать произвольное
сочетание объектного и реляционного доступа к СУБД Caché и все дополнительные
возможности Caché, связанные с доступом к устройствам, внешним системам
и т.д.
Наряду с Java и EJB binding, СУБД Caché предоставляет возможность проецирования
классов Caché в классы C ++. Архитектура C ++ binding сходна с проецированием
в Java и наряду с отображением классов Caché в классы C ++ заботится о конкурентном
доступе к объектам и о транзакционности. Кроме того, стоит отметить, что C
++-проецирование (как и все остальные виды проецирования) оптимизировано под
распределенные архитектуры и использует механизм кэширования для минимизации
трафика между C ++-приложениями и Caché-сервером.
Рассмотрим простейший пример использования классов Caché из C ++
d_ref <Sample_Person> p1 = Sample_Person::openid(&db, L"1");
p1->setDOB(1970,2,1);
Листинг 2
C ++-библиотека, поставляемая вместе с Caché, содержит шаблонный класс d
_ ref <>, инкапсулирующий логику обращения к промежуточным классам и
реализованный по концепции smart pointer, что позволяет вызывать методы промежуточных
классов через “->” синтаксис, копировать d _ ref <> таким образом,
что два экземпляра будут указывать на один объект, передавать экземпляр d _
ref <> в промежуточный метод «по ссылке» и т.п.
Все рассмотренные выше способы доступа были ориентированы на обращение к Caché
извне. Однако, нередко встречаются ситуации, когда на основе данных, хранящихся
в Caché необходимо сформировать отчет в привычной табличке Excel, сгенерировать
документ в формате Word, PDF или сделать еще какое-нибудь действие, связанное
с обращением к COM-объектам. В этом случае может оказаться полезным специальный
механизм Caché Activate , позволяющий взаимодействовать с ActiveX -компонентами
как с обычными объектами Caché. Методика использования Caché Activate очень
проста: с помощью Caché Activate Wizard для конкретного COM-компонента создается
специальный клас c (таких классов может быть несколько), экземпляр которого
затем используется в приложении для доступа к соответствующему компоненту.
Рассмотрим пример использования компонента Microsoft SysInfo Control. В первую
очередь воспользуемся Caché Activate Wizard для создания «обертки» вокруг ActiveX
-компоненты.
Рисунок 3
После того, как специальные классы созданы, появляется возможность использования
компоненты SysInfo в приложениях Caché. К примеру, следующий код получает системную
информацию о состоянии батареи на ноутбуке.
Set obj = ##Class(Activate.SysInfoLib.SysInfo).%New()
Write !,obj.BatteryLifePercent
Write !,obj.BatteryLifeTime
Листинг 3
Аналогичным способом можно получать информацию от любой другой доступной компоненты.
Однако, у данного подхода есть один большой недостаток – он функционирует на
платформах, поддерживающих ActiveX . Для того, чтобы вызывать внешние приложения
на других платформах, в Caché существует механизм callout, позволяющий выполнять
команды таких операционных систем как UNIX, MS - DOS, OpenVMS. С практической
точки зрения существует несколько вариантов вызова внешних команд. Если достаточно
интерактивного взаимодействия с операционной системой из терминала Caché, то
можно воспользоваться утилитой % CLI. В случаях, когда обращение к внешней
среде необходимо встроить непосредственно в программную логику, можно использовать
синхронную функцию $ zf (-1) или ее асинхронный аналог $ zf (-2). Простейший
пример использования функции $ zf (-1) представлен на Листинге 4
Set status = $ZF(-1,"mkdir test")
Листинг 4
Отличительной чертой механизма callout является возможность вызова разделяемых
библиотек (в Windows это DLL , в UNIX - shared library , в OpenVMS - shared
executable). Ввиду сильной зависимости таких библиотек от платформы, детали
реализации следует согласовывать с документацией Caché. Нужно отметить, что
в дополнение к механизму callout существует противоположный ему по действию
механизм callin, задачей которого является эффективное выполнение команд Caché
из программ, написанных на С, что позволяет использовать его не только в
GUI -приложениях для взаимодействия клиентской части с серверной, но и в высокопроизводительных
телеметрических системах, где в режиме реального времени с приборов и датчиков
снимаются показания и передаются в Caché для дальнейшей обработки.
В последнее время не угасает интерес к сервисно-ориентированным архитектурам
(SOA), в которых все функции системы реализованы как независимые сервисы.
Последовательность вызова этих сервисов определяет тот или иной бизнес-процесс.
Зачастую термин архитектур, ориентированных на службы отождествляют с веб-службами,
базирующимися на стандартах XML, SOAP и HTTP. Протокол SOAP (Simple Object
Access Protocol) предоставляет простой механизм для обмена структурированной
и типизированной информацией между узлами децентрализованной, распределенной
системы, посредством обмена XML-сообщениями. В качестве транспорта в большинстве
случаев используется HTTP. Caché обеспечивает полную и прозрачную поддержку
веб-служб без установки какого-либо промежуточного программного обеспечения
или расширений. Механизм Caché SOAP позволяет с легкостью создавать поставщиков
сервисов и их потребителей на основе единой объектной модели Caché, благодаря
чему каждый класс Caché без каких-либо изменений может стать и веб-службой,
если к списку родительских классов добавить % SOAP.WebService. В этом случае
все методы этого класса, помеченные ключевым словом WebMethod становятся доступными
в рамках веб-службы, и при компиляции класса из списка этих методов автоматически
генерируется набор SOAP -интерфейсов. Общая схема механизма Caché SOAP представлена
на следующем рисунке:
Рисунок 4
В качестве еще одного способа создания распределенных систем можно предложить
использование так называемых федеративных баз данных, размытых по гетерогенной
среде, где каждый узел может функционировать на различных программных и аппаратных
платформах. В качестве протокола взаимодействия между узлами можно использовать
ODBC или JDBC. Кроме того, СУБД Caché предлагает дополнительный механизм
SQL Gateway, предоставляющий объектный доступ к внешним реляционным СУБД.
Допустим, во внешнем отношении Person хранится информация о сотрудниках фирмы.
Caché позволяет автоматически (с помощью Link Table Wizard) создать специальный
класс Person, инкапсулирующий логику обращения к внешней РСУБД, и использовать
его экземпляры также как и обычные классы Caché.
Рисунок 5
Отметим, что механизм SQL Gateway открывает широкие перспективы не только
в создании распределенных систем, но и в безболезненной миграции существующих
реляционных приложений на Caché.
Описанных выше способов взаимодействия с COM, Java, C, реляционными системами
уже достаточно, чтобы утверждать, что СУБД Caché лишена свойств «черного ящика»,
и может служить ядром для высокопроизводительных систем с открытой архитектурой.
Более того, в данной статье мы сознательно не рассматривали аспекты интеграции
с протоколами FTP, HTTP, SMTP, POP3, LDAP , TCP/IP, очередями сообщений
IBM MQ Series и многим другим, что в совокупности с возможностями встроенного
языка Caché Object Script позволяет организовать взаимодействие практически
с любой системой.