Создание примера программы мониторинга состояния DB2 для PHP: Часть 2. DB2 pureXML или DOM? Решайте сами

Технология DB2 9 pureXML™ позволяет организациям улучшить целостность данных и избежать программной обособленности унаследованных данных. Эта технология позволяет разработчикам использовать лучшую среду для хранения данных в своих задачах и избавляет от необходимости написания промежуточной бизнес-логики, без которой ранее было невозможно воспользоваться технологией Web-сервисов. Кроме того, pureXML позволяет администраторам баз данных сосредоточить логическую часть в рамках сервера БД и помогает оптимизировать производительность. Что еще более важно, данная технология помогает упростить разработку приложений, применяя базы данных для того, что они умеют делать лучше всего: описания, поиска и хранения информации. Чтобы показать, как это делается, в данной статье используется пример программы мониторинга состояния DB2.

Ризван Теджпар, разработчик систем управления DB2, IBM

Ризван Теджпар (Rizwan Tejpar) является студентом программы Industry Internship Program (IIP) корпорации IBM, где он разрабатывает примеры приложений для демонстрации работы DB2 с open-source технологиями. Он выступал на конференции ZendCon в 2006 году и на конференции SDWest в 2007 году, где демонстрировал на стенде торговой выставки возможности DB2 pureXML™ для разработчиков ПО. Самым последним вкладом автора является пример программы мониторинга состояния DB2 для PHP, разработанный на основе архитектуры SOA. Ризван владеет несколькими языками программирования, в том числе C++, C# .NET, SQL, XQuery и JSP.



20.10.2008

Управление информацией: DB2 9

Как рассказывалось в первой части, разработчики приложений часто используют языки программирования промежуточного уровня, такие как PHP, вместе с соответствующим DOM-парсером, с помощью которого данные заново описываются и структурируются в формат XML. На уровне предприятия умножьте это на n. Представьте себе n сервисов и n приложений, каждое из которых преобразует данные в XML, возможно используя при этом различные технологии. С точки зрения разработки программного обеспечения это приводит к проблемам, в особенности касающимся управления, производительности и целостности данных.

Прежде всего, заметьте, что на самом деле данные обрабатываются дважды: первый раз посредством SQL внутри механизма БД и второй раз – на уровне приложения. Это представляет дополнительный риск, обусловленный тем, что как только данные были изменены на уровне приложения, за пределами механизма БД, их целостность больше не может быть гарантирована. Кроме того, хотя алгоритмическая сложность работы по анализу и структурированию данных за пределами механизма БД и остается постоянной, результирующая производительность может варьироваться в зависимости от используемого языка программирования.

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

СУБД IBM DB2 9 решает этот вопрос путем использования возможностей механизма pureXML и механизма гибридной базы данных. Данные, которые ранее могли храниться только в традиционном реляционном формате, теперь изначально могут храниться в формате XML. Кроме того, как в случае с примером программы мониторинга состояния DB2, также возможно "на лету" преобразовывать данные традиционного формата SQL в документы XML в пределах механизма БД.

С этой стороны DB2 9 предоставляет следующие возможности:

  • Организации могут улучшить целостность данных и избежать изоляции данных старого формата.
  • Разработчики приложений могут использовать наилучшую среду хранения данных в своих задачах и избавиться от необходимости написания промежуточной логики для преобразования данных в формат XML.
  • Администраторы баз данных могут сосредоточить логическую часть в рамках сервера БД, оптимизировать и обеспечить производительность на заданном уровне.

Хотя в примере приложения мониторинга состояния DB2 механизм pureXML используется с самого начала, на нем, тем не менее, можно продемонстрировать все три сценария перехода к pureXML, в которых используется программный код и выполнение запросов:

  1. Несколько запросов SQL с DOM-обработкой
  2. Несколько запросов SQL-XML с DOM-обработкой
  3. Один запрос XQUERY с несколькими вложенными запросами SQL-XML

Каждый последующий сценарий строится на основе предыдущего и использует pureXML все в большей степени.

**В целях демонстрации код и запросы, приведенные ниже в примере программы мониторинга состояния DB2, создают только раздел описания состояния (являющийся частью отчета о состоянии) в соответствии с тем, как это описано в его определении схемы XML (XML Schema Definition, XSD).

Сценарий 1

Запросы SQL, приведенные в листинге 1, извлекают требуемую информацию описания состояния, включающую в себя данные об администраторе базы данных, самой базе данных, хранилище табличной области и его объектах. В результате выполнения запроса формируется таблица; следовательно, для создания структуры данных в формате XML необходимо использовать DOM-обработку, как это показано в листинге 2.

Листинг 1. Запрос SQL, извлекающий требуемую информацию описания состояния
SELECT  t1.ID, t1.NAME, t1.SHORT_DESCRIPTION, t1.LONG_DESCRIPTION, t1.TYPE, t1.FORMULA, 
		t1.UNIT, t2.EVALUATE, t2.SENSITIVITY, t2.ALARM_THRESHOLD, 
		t2.WARNING_THRESHOLD 
FROM table(health_get_ind_definition('en_US')) as t1,
     table(
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('TS', 'G', '','')) as t 
       UNION	
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('TSC', 'G', '','')) as t 
       UNION
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('DBM', 'G', '','')) as t 
       UNION
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('DB', 'G', '','')) as t
     ) as t2
WHERE t1.ID = t2.ID
Листинг 2. DOM-обработка для создания структуры данных в формате XML
$dom = new DOMDocument('1.0');
$root = $dom->appendChild(new DOMElement('DB2Health_Report'));
$defset = $root->appendChild(new DOMElement('HIDefinitionSet'));

for($i = 0; $i < count($result); $i++)
{
	$def = $defset->appendChild(new DOMElement('HIDefinition'));
	$def->setAttribute('hiIdentifier', $result[$i]['ID']);
	$def->setAttribute('hiName', $result[$i]['NAME']);
	$def->setAttribute('hiShortDesc', $result[$i]['SHORT_DESCRIPTION']);
	$def->setAttribute('hiLongDesc', $result[$i]['LONG_DESCRIPTION']);
	$def->setAttribute('hiType', $result[$i]['TYPE']);
	$def->setAttribute('hiFormula', $result[$i]['FORMULA']);
	$def->setAttribute('hiUnit', $result[$i]['UNIT']);

	$settings = $def->appendChild(new DOMElement('HISettings'));
	$settings->setAttribute('sensitivity', $result[$i]['SENSITIVITY']);
	$settings->setAttribute('evaluate', $result[$i]['EVALUATE']);
	$settings->setAttribute('alarmThreshold', $result[$i]['ALARM_THRESHOLD']);
	$settings->setAttribute('warningThreshold', $result[$i]['WARNING_THRESHOLD']);
}

$xml = $dom->saveXML();

Сценарий 2

SQL-XML – это еще один стандарт, позволяющий определять структуру XML внутри самого запроса. Как показано в листинге 3, вместо того, чтобы определять элементы и атрибуты в рамках DOM, это можно сделать внутри самого запроса. Другими словами, для каждой строки, которая ранее возвращалась в виде набора столбцов, возвращается документ XML.

Листинг 3. Запрос SQL-XML, возвращающий документ XML
SELECT
    XMLELEMENT
    (
        NAME "HIDefinition",
        XMLATTRIBUTES
        (
            t1.ID as "hiIdentifier",
            t1.NAME as "hiName",
            t1.SHORT_DESCRIPTION as "hiShortDesc",
            t1.LONG_DESCRIPTION as "hiLongDesc",
            t1.TYPE as "hiType", 
            t1.FORMULA as "hiFormula",
            t1.UNIT as "hiUnit"			
        ),
        XMLELEMENT
        (
            NAME "HISettings",
            XMLATTRIBUTES
            (
                t2.SENSITIVITY as "sensitivity",
                t2.EVALUATE as "evaluate",
                t2.ALARM_THRESHOLD as "alarmThreshold",
                t2.WARNING_THRESHOLD as "warningThreshold"
            )
        )
    )
FROM table(health_get_ind_definition('en_US')) as t1,
     table(
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('TS', 'G', '','')) as t 
       UNION	
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('TSC', 'G', '','')) as t 
       UNION
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('DBM', 'G', '','')) as t 
       UNION
            SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD, WARNING_THRESHOLD 
            FROM table(HEALTH_GET_ALERT_CFG('DB', 'G', '','')) as t
     ) as t2
WHERE t1.ID = t2.ID

В данном случае для того, чтобы собрать все определения в единую структуру документа XML, требуется лишь минимальная DOM-обработка, как показано в листинге 4.

Листинг 4. DOM-обработка для сбора всех определений в единый документ XML
$dom = new DOMDocument('1.0');
$dom->loadXML('<DB2Health_Report></DB2Health_Report>');

$def_set = new DOMDocument('1.0');
$def_set->loadXML('<HIDefinitionSet>'. $result .'</HIDefinitionSet>');

$root = $dom->getElementsByTagName('DB2Health_Report')->item(0);
$def_set_root = $def_set->getElementsByTagName('HIDefinitionSet')->item(0);

$import = $dom->importNode($def_set_root, true);
$root->appendChild($import);

$xml = $dom->saveXML();

Сценарий 3

Запрос, приведенный ниже, является альтернативой процессу, описанному в сценарии 1. При данном подходе нет необходимости использовать какие-либо внешние механизмы объединения данных, и необходимость в DOM-обработке полностью исчезает. Язык запросов XQuery используется в качестве механизма для определения полной структуры документа XML, а запрос SQL-XML, приведенный в сценарии 2, является вложенным и предназначен для того, чтобы построить подраздел описания состояния, являющийся частью отчета о состоянии. Обычно достаточно одного лишь оператора XQuery; тем не менее, поскольку информация о состоянии хранится в традиционном формате SQL, для преобразования данных в эквивалент XML требуется использование SQL-XML.

Листинг 5. Запрос XQuery для определения полной структуры документа XML
xquery
<DB2Health_Report>
    <HIDefinitionSet>
    {
      for $def in db2-fn:sqlquery('
          SELECT
              XMLELEMENT
              (
                  NAME "HIDefinition",
                  XMLATTRIBUTES
                  (
                      t1.ID as "hiIdentifier",
                      t1.NAME as "hiName",
                      t1.SHORT_DESCRIPTION as "hiShortDesc",
                      t1.LONG_DESCRIPTION as "hiLongDesc",
                      t1.TYPE as "hiType", 
                      t1.FORMULA as "hiFormula",
                      t1.UNIT as "hiUnit"			
                  ),
                  XMLELEMENT
                  (
                      NAME "HISettings",
                      XMLATTRIBUTES
                      (
                          t2.SENSITIVITY as "sensitivity",
                          t2.EVALUATE as "evaluate",
                          t2.ALARM_THRESHOLD as "alarmThreshold",
                          t2.WARNING_THRESHOLD as "warningThreshold"
                      )
                  )
              )
          FROM table(health_get_ind_definition('en_US')) as t1,
               table(
                      SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD,WARNING_THRESHOLD 
                      FROM table(HEALTH_GET_ALERT_CFG('TS', 'G', '','')) as t 
                 UNION	
                      SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD,WARNING_THRESHOLD 
                      FROM table(HEALTH_GET_ALERT_CFG('TSC', 'G', '','')) as t 
                 UNION
                      SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD,WARNING_THRESHOLD 
                      FROM table(HEALTH_GET_ALERT_CFG('DBM', 'G', '','')) as t 
                 UNION
                      SELECT ID, EVALUATE, SENSITIVITY, ALARM_THRESHOLD,WARNING_THRESHOLD 
                      FROM table(HEALTH_GET_ALERT_CFG('DB', 'G', '','')) as t
               ) as t2
          WHERE t1.ID = t2.ID			
      ')
      return $def
    }
    </HIDefinitionSet>
</DB2Health_Report>

Полный отчет о состоянии

Все три сценария, приведенные выше, создавали лишь раздел описания, являющийся частью полного отчета о состоянии. Чтобы создать полную структуру, определенную в схеме XSD, было использовано это решение на базе pureXML.

Запрос, приведенный в последнем листинге, может показаться пугающе сложным. Хотя это один оператор языка XQuery, он содержит несколько вложенных запросов SQL-XML, предназначенных для сбора информации о состоянии из четырех типов объектов БД. XQuery выступает лишь в качестве упаковщика, который "склеивает" вместе все составляющие документы XML. Чтобы дать представление о том, сколько в этом примере используется запросов, ниже приведен разбор каждого раздела отчета о состоянии на подзапросы:

Таблица 1. Разбор оператора XQuery на подзапросы
Раздел отчета о состоянииКоличество подзапросовОписание
InfoSet6Информация панели состояния
HIDefinitionSet1Информация описания состояния
AlertSet7Предупреждения о состоянии
ErrorSet0Информация об ошибках
ВСЕГО14

Обратите внимание на четко определенное перекрытие сценариев и на конкретность размещения логики компоновки данных:

  1. Сценарий 1: данные возвращаются в виде таблицы с заданными столбцами, получаемой с помощью определяемых пользователем функций состояния. Для компоновки данных в общую структуру XML используется DOM-обработка.
  2. Сценарий 2: для получения данных используется тот же самый источник, но вместо задания столбцов задаются элементы и атрибуты. Для компоновки данных в общую структуру XML используется DOM-обработка.
  3. Сценарий 3: структура данных из второго сценария размещается внутри общей структуры XML при помощи XQuery, выступающего в роли механизма упаковки данных.

Все вышеперечисленное можно объединить в следующей диаграмме:

Рисунок 1. Сводный обзор сценариев
Сводный обзор сценариев

Итак, при использовании единственного запроса мы только упрощаем поддержку приложения, а с точки зрения администратора базы данных усовершенствуем процесс диагностики неисправностей. Получив возможность полностью сосредоточить логику внутри сервера БД, например, в хранимых процедурах, администраторы БД могут теперь делать то, что они умеют делать лучше всего: оптимизировать базы данных для получения гарантированного уровня производительности и целостности данных. Несмотря на то, что данные могут храниться в формате XML, к ним применимы все те же идеи, что и для SQL: индексирование, логика на стороне сервера и оптимизация запросов.

Заключение

В этой статье был описан процесс создания простого сервиса мониторинга состояния DB2, основанного на существующих, традиционных данных формата SQL. Этот пример был рассмотрен как с точки зрения SOA, так и с точки зрения централизации данных. Архитектура SOA дала представление о гибкости стека программного обеспечения – идее использования в задачах лучших технологий наряду с поддержкой четкого разделения между уровнями представления, бизнес-логики и источников данных. Что более существенно, подход с использованием централизации данных привел нас к идее об упрощении приложений SOA до традиционного уровня разработки ПО за счет применения механизма БД для того, что он умеет делать лучше всего: описания, поиска и хранения информации.

Итак, что делать дальше?

Наш простой сервис может отслеживать состояние базы данных DB2 на любом сервере; представьте теперь, что он может следить за множеством баз данных на множестве серверов. Развивая эту идею еще дальше, представьте, что все полученные отчеты о состоянии могут быть собраны в один сводный отчет и в конечном итоге с помощью XSLT преобразованы в ленту RSS/ATOM.

Если вернуться к нашему контексту, мы использовали механизм БД для переопределения и реорганизации данных в тот формат, который позволяет просматривать информацию об изменении состояния баз данных и серверов DB2 в масштабах всей организации.

Если DB2 позволяет сделать это для повышения эффективности бизнеса с управленческой точки зрения, почему бы не применить те же методы для анализа данных, относящихся к работе с клиентами?

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Другие файлы для загрузки

  • Демо: Web 2.0 Starter Toolkit for DB2 (Демо-версия программы мониторинга состояния включена в пакет Web 2.0 Starter Toolkit for DB2 (PHP))

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management, Open source
ArticleID=346825
ArticleTitle=Создание примера программы мониторинга состояния DB2 для PHP: Часть 2. DB2 pureXML или DOM? Решайте сами
publish-date=10202008