Существует еще одна причина для применения косвенной адресации: благодаря этому
можноотслеживать частоту вызовов объектов для организации эффективного механизма
свопинга.
Это необходимо для реализации уже второго необходимого свойства баз данных –
масштабируемости. Опять следует упомянуть организациюраспределенных компонентов.
Классическая схема клиент-сервер, где основная нагрузка приходится на клиента
(такая архитектура называется еще “толстыйклиент-тонкий сервер”), лучше
справляется с этой задачей, чем мэйнфреймовая структура, однако ее все равно
нельзя масштабировать до уровня предприятия.Благодаря многозвенной архитектуре
клиент-сервер (N-Tier architecture) происходит равномерноераспределение
вычислительной нагрузки между сервером и конечным пользователем. Нагрузка
распределяется по трем и более звеньям, обеспечивающим
дополнительнуювычислительную мощность. К чему же еще ведет такая практика?
“Архитектура клиент-сервер, еще совсем недавно считавшаяся сложной средой,
постепеннопревратилась в исключительно сложную среду. Почему? Благодаря
ускоренному переходу к использованию систем клиент-сервер нескольких звеньев”
(PCMagazine).Разработчикам приходится расплачиваться дополнительными
сложностями, большими затратами времени и множеством проблем, связанных с
интеграцией. Оставимочередное упоминание распределенных компонентов на этой не
лишенной оптимизма ноте.
Рисунок 3 Прямая и косвенная адресации.
Третье необходимое качество базы данных – это отказоустойчивость. Именно это
свойство отличает программныйпродукт от “прилады”. Существуют несколько способов
обеспечения отказоустойчивости:
резервное копирование и восстановление;
распределение компонентов;
независимость компонентов;
копирование.
Руководствуясь первым принципом, программист определяет потенциально опасные
участки кода и вставляетв программу некоторые действия, соответствующие началу
транзакции – сохранение информации, необходимой для восстановления после сбоя, и
окончанию транзакции –восстановление или, в случае невозможности, принятие
каких-то других мер, например, отправка сообщения администратору. В современных
СУБД этот механизмобеспечивает восстановление в случае возникновения практически
любой ошибки системы, приложения или компьютера, хотя, конечно, нельзя говорить
об идеальнойзащите от сбоев.
В мэйнфреймовой архитектуре единственным источником сбоев была центральная ЭВМ.
При переходе к распределенной многозвенной организацииошибки могут вызывать не
только компьютеры, включенные в сеть, но и коммуникационные каналы. В
многозвенной архитектуре при сбое одного из звеньевбез специальных мер
результаты работы других окажутся бесполезными. Поэтому при разработке
распределенных систем обеспечивается принципиально более высокийуровень
обеспечения отказоустойчивости. Назовем обязательные для современных
распределенных СУБД свойства:
прозрачный доступ ко всем объектам независимо от ихместоположения, благодаря
чему пользователю доступны все сервисы СУБД и может производиться
перераспределение компонентов без нежелательных последствий.
так называемый “трехфазный монитор транзакций” (third-party transaction
monitor), благодаря которомутранзакция выполняется не в два, а в три этапа –
сначала посылается запрос о готовности к транзакции.
Что произойдет, если один из компонентов выйдет из строя? Система, созданная в
соответствии только с вышеизложенными доводами,приостановит работу всех
пользователей и прервет все транзакции. Поэтому важно такое свойство СУБД, как
независимость компонентов.
При сетевом сбое сеть разделяется на части, компоненты каждой из которых не
могут сообщаться с компонентами другой части. Для того,чтобы сохранить
возможность работы внутри каждой такой части, необходимо дублирование критически
важной информации внутри каждого сегмента. Современныесистемы позволяют
администратору базы данных динамически определять сегменты сети, варьируя таким
образом уровень надежности всей системы в целом.
И, наконец, о копировании (replication) данных. Простейшим способом является
добавление к каждому (основному) серверу резервного. После каждойоперации
основной сервер передает измененные данные резервному, который автоматически
включается в случае выхода из строя основного. Естественно, такаясхема не лишена
недостатков. Во-первых, это приводит к значительным накладным расходам при
дублировании данных, что не только сказывается напроизводительности, но и само
по себе является потенциальным источником сбоев. Во-вторых, в случае сбоя,
повлекшего за собой разрыв соединения между двумясерверами, каждый из них должен
будет работать в своем сегменте сети в качестве основного сервера, причем
изменения, сделанные на серверах за время работы втаком режиме, будет невозможно
синхронизовать даже после восстановления работоспособности сети.
Более совершенным является подход, когда создается необходимое (подбираемое в
соответствии с требуемым уровнем надежности) числокопий в сегменте. Таким
образом увеличивается доступность копий и даже (при распределении нагрузки между
серверами) повышается скорость чтения. Проблеманевозможности обновления данных
несколькими серверами одновременно в случае их взаимной недоступности решается
за счет разрешения проведения модификацийтолько в одном из сегментов, например
имеющем наибольшее число пользователей. При хорошо настроенной схеме кэширования
затраты на накладные расходы придублировании модифицированных данных близки к
нулю.
5.3 Стандартыобъектных баз данных.
Для обеспечения переносимости приложений (приложение может работать на разных
СУБД) и совместимости с СУБД (может взаимодействовать сразными СУБД),
естественно, необходима выработка стандартов. Сразу заметим, что установление
стандартов лишает производителя в некоторой степени свободы впринятии решений и
увеличивает стоимость продукта за счет лицензионных отчислений и больше не будем
обсуждать целесообразность (прямо скажем,очевидную) стандартизации.
В области объектных СУБД в настоящее время выработаны стандарты для:
объектной модели;
языка описания объектов;
языка организации запросов (Object Query Language – OQL);
“связующего” языка (C++ и, конечно же, Smalltalk);
администрирования;
обмена (импорт/экспорт);
интерфейсов инструментария и др.
Хотя у Microsoft и свое мнение на этот счет, организацией, выработавшей наиболее
используемые насегодня и устоявшиеся стандарты, является консорциум поставщиков
ООСУБД ODMG (ООСУБД), которого поддерживаютпрактически все действующие лица
отрасли. В сотрудничестве с OMG, ANSI, ISO и другимиорганизациями был создан
стандарт ODMG-93. Этот стандарт включает в себя средства для
построениязаконченного приложения, которое будет работать (после перекомпиляции)
в любой совместимой с этой спецификацией ООСУБД. В книгу ODMG-93 входят
следующие разделы:
Язык определения объектов (Object Definition Language – ODL);
Язык объектных запросов (Object Query Language – OQL);
Рисунок 4 Схема использования ODL для построения приложения.
Связывание с C++;
Связывание со Smalltalk.
ODL. В качестве языка определения объектов (ODL) ODMG был выбран существующий
язык IDL(Interface Definition Language – язык описания интерфейсов), который был
дополнен такими необходимыми дляобъектных БД свойствами, как определение
коллекций, двунаправленных связей типа “многие-ко-многим”, ключей и др. В
сочетании со средствами языка IDL определения атрибутов и операций, это
позволяет определять практически любые объекты. Все дополнения реализованы в
видедоопределения методов, что обеспечивает совместимость со стандартами OMG,
например стандартом CORBA.
Рисунок 4 показывает работоспособную схему для построения приложения на
стандартных языках программирования, в процессе которой
автоматическигенерируются метаданные, заголовочные файлы и методы. Приведем
также пример на языке ODL из “белой книги” компании Objectivity,
которыйиллюстрирует связи типа “один-ко-многим”, объявленные между
преподавателем и студентами:
interface professor : employee {
attribute string <32> name;
unique attribute lang unsigned ssn;
relationship dept works_in inverse faculty; relationship set<section>
teaches inverse taught_by; . . . operations . . .
{
interface section : class {
. . . taught_by: professor . . . ;
. . .
}
OQL. За основу языка OQL была взята команда SELECT языка SQL2 (или SQL-92) и
добавлены возможностьнаправлять запрос к объекту или коллекции объектов и
возможность вызывать методы в рамках одного запроса. Данные, полученные в
результате запроса, могутбыть скалярными (включая кортежи), объектами или
коллекциями объектов. Некоторые примеры наязыке OQL (тот же источник):
• Select x from x in faculty where x.salary >
x.dept.chair.salary
•sort s in (select struct (name: x.name, s:x.ssn) from
x in faculty where for all y in
x.advisees:y.age<25) by s.name
• Chair.salary
• Students except TAs
•list (1,2) + list (count (jse.advisees), 1+2)
• exists x in faculty [1:n]: x.spouse.age<25
C++. Спецификация ODMG-93 позволяет программистам легко использовать объекты в
то время как ООСУБД прозрачнымобразом управляет ими. При определении стандарта
члены ODMG руководствовались следующими принципами:
Использование стандартных компиляторов обеспечивается тем, что все расширения
реализуютсясредствами языка – библиотеками классов и перегрузкой операторов.
Определение временных экземпляров (Transient Instance) и экземпляров,
создаваемых на длительный срок (Transient Instance) припомощи оператора new().
При перегрузке оператора new() оба типа экземпляров могут создаваться от
одного класса, который может существовать продолжительноевремя.