ТРЕХЗВЕННЫЕ БАЗЫ ДАННЫХ

СЕРВЕР ПРИЛОЖЕНИЙ

Все ранее рассмотренные вопросы относятся к построению базы данных по архитектуре «клиент—сервер» двухзвенная структура (см. рис. 1.3). Трехзвенная структура той же архитектуры представлена на рис. 1.4. Отличие двухзвенной структуры от трехзвенной состоит в том, что между сервером базы данных и приложением клиента появилось новое звено — сервер приложений.

Все три звена (сервер базы данных, сервер приложений и клиентское приложение) могут размещаться как на трех персональных компьютерах, так и на одном (или двух) персональном компьютере. Сервер баз данных в трехзвенной структуре проектируется по ранее рассмотренным правилам и размещается или на другом персональном компьютере (remote server), или на том же персональном компьютере (local server), что и сервер приложений (и, может быть, приложение клиента).

Проектирование сервера приложений и приложения клиента выполняется с использованием специальных компонентов.

Главное достоинство трехзвенной структуры состоит в том, что значительно снижаются требования к аппаратной части персонального компьютера клиента за счет переноса компонентов доступа к данным и бизнес-логики на сервер приложений.

В среде Borland Delphi базы данных по трехзвенной структуре можно строить с использованием технологий COM (DCOM), MTS и CORBA.

При создании сервера приложений прежде всего надо решить вопрос: в какой технологии будет реализован сервер приложений? В зависимости от выбранной технологии будет изменяться состав компонентов, реализующих сервер приложений. Алгоритм создания сервера приложений остается постоянным.

1. Запустить Delphi и в приложение добавить новый лист с помощью команды главного меню

File -» New Other

и выбрать вкладку «Multitier» (рис. 14.1).

Выбор Мастера

Рис. 14.1. Выбор Мастера

  • 2. В соответствии с выбранной технологией создания сервера приложений на вкладке «Multitier» выбрать соответствующую пиктограмму. Для технологии DCOM — пиктограмма «Remote Data Module». После выбора пиктограммы запускается соответствующий Мастер.
  • 3. В поле ввода «CoClass Name» Мастера (рис. 14.2) необходимо указать имя класса — Server. После нажатия кнопки ОК в проект будет добавлен лист «Server».
  • 4. На листе «Server» разместить компоненты доступа к базе данных. Например, IBDatabase, IBTransaction, IBQuery, IBDataSet, DataSetProvider. Последний компонент находится на вкладке Data Access (рис. 14.3). Количество компонентов IBDataSet соответствует количеству таблиц в базе данных и такому же количе-

Remote Data Module Wizard

CoClass Name: Server

instancing: Multiple Instance

Threading Model: | Apartment

OK

Cancel

Help

Рис. 14.2. Работа с Мастером

РServer

?©в

IB

BDatabasel

IBDSMobiles

Щ0|

IB

F

? Transaction!

IBDSCamera

sql?

IB h

F

IBDSFirm

JStoredProcl

ul

IB

IB DS Display

u

D ataS etProviderM ob iles

IB

Ш

D ataS etProviderCam era

?Щ)

ІШ

DataSetProviderFirnn

m

D ataS etProviderD isplay

m

IBDSMemory DataSetProviderMernory

??J|

IB SQL

IB Q All

IB D S Countries D ataS etProviderCont ries

IBDST ransferCDataSetProviderT ransferDevices

m

IBDSSoundFoiDataSetProviderSoundFormats

IB

Ill

DataSetProviderAII

Рис. 14.3. Пример сервера приложений

ству компонентов DataSet Provider. Между компонентами устанавливают связи. Сохранить созданное приложение в специально созданной папке.

  • 5. Запустить приложение и сразу закрыть окно FormX. В результате выполненных действий в реестр WINDOWS будет добавлена соответствующая запись.
  • 6. Сервер приложений запущен и готов к работе.

При последующей работе с базой данных сначала запускается сервер приложений (п. 5 представленного выше алгоритма), а затем запускается приложение клиента (или клиентов).

Описанный выше алгоритм позволяет создать компонент ТRemoteDataModule, который является фундаментом для создания сервера приложений, ориентированного на работу по технологии DCOM. Созданному компоненту (модулю) присваивается имя «Server» и в нем размещаются компоненты доступа к серверу базы данных (первому звену).

Использование второй пиктограммы «Transactional Data Module» (см. рис. 14.1) позволяет создать компонент TMTSDataModule для работы по технологии MTS или СОМ+.

рЩ-

Компонент TDataSetProvider

Компонент ТDataSet Provider размещен на вкладке Data Access и обеспечивает связь сервера приложений с клиентским приложением. Компонент ТDataSet Provider, получив набор данных от компонента доступа к данным, упаковывает его и отсылает пакет приложению клиента. Для приема пакета в клиентском приложении устанавливается компонент TClientDataSet, который, получив пакет с набором данных, распаковывает его и предоставляет набор данных пользователю. Как правило, количество компонентов ТDataSet Provider соответствует количеству таблиц базы данных.

Основные свойства и методы компонента:

property Data: Olevarianf, — содержит пакет данных, предназначенный для передачи клиентскому приложению. Свойства Readonly,

property DataSet TDBDataSet, — содержит ссылку на компонент доступа к данным (для примера рис. 14.3 — ссылка на компонент IВ Data Set)',

property Exported: Boolean', — если свойство содержит значение True, то клиенту разрешено обращаться к провайдеру, используя интерфейс IAppServer',

property Constraints'. WordBool', — если свойство содержит значение True, то пользователю передаются сведения о наложенных ограничениях на значения элементов набора данных;

property Params: TParams', — содержит параметры текущего соединения;

property Resolver. ТCustom Resolver, — содержит ссылку на компонент, с помощью которого выполняется обновление данных и разрешаются конфликты, возникающие при обновлении данных;

property ResolverToDataSet Boolean; — если свойство содержит значение True, то выполняется процедура обновления набора данных. Имя набора данных указано в свойстве DataSet. Если свойство содержит значение False, то обновление данных выполняется на сервере базы данных', property Options'. ТProvider Options', — определяются данные, которые будут помещены в пакет, и правила использования этих данных. Свойство может содержать одну или несколько констант:

роAllowCommandText — разрешает параллельное выполнение нескольких команд;

poAllow Multi Record Updates — разрешает обновление нескольких записей;

poAutoRefresh — разрешает автоматическое обновление записей при их редактировании; poCascadeDeletes — разрешает серверу выполнять каскадное удаление связанных записей; poCascadeUpdates — разрешает серверу выполнять каскадное редактирование связанных записей; ро Disable Edits — запрещает редактирование записей; ро Disable Deletes — запрещает удаление записей; ро Disable Inserts — запрещает добавление новых записей; ро Fetch BlobsOn Demand — запрещает размещение в пакете содержимого 5/об-полей;

poFetchDetailsOnDemand — запрещает размещение в пакете данных из подчиненных таблиц. Для работы с такими данными следует использовать метод Fetch Details',

poIncFieldProps — разрешает размещение в пакете сведений о некоторых свойствах полей; poNoReset — отключает анализ на наличие первой записи текущего пакета в ранее переданном пакете; poPropogateChanges — организует возврат клиенту изменений в наборе данных, которые выполнены обработчиками After Update Records или Before Update Records; poReadOnly — предоставляет данные клиенту в режиме «только для чтения»;

procedure Execute(const CommandText: WideString, var Params, Owner Data: Ole Variant); override; — выполняет 501-запрос или хранимую процедуру;

function ApplyUpdates(Delta: Ole Variant; MaxError: Integer; out ErrorCount: Integer); Ole Variant; override; — обновляет записи набора данных, вызывая для этого одноименный метод ассоциированного объекта Resolver, и возвращает результат вызванного метода:

Delta — содержит добавленные, отредактированные или удаленные записи;

MaxError — содержит максимально допустимое количество ошибок;

ErrorCount — содержит фактическое количество ошибок;

function Fetch Data(const Packet: Ole Variant): Ole Variant;

override; — вызывает одноименный метод ассоциированного объекта Resolver для чтения записей из подчиненной таблицы или значения поля типа Blob и возвращает результат вызванного метода;

function Get Records( Count: Integer; out RecsOut: Integer):

OleVariant; override; — считывает информацию из подключенного объекта DataSet. Тип считываемой информации определяется значением параметра Count.

-1 — чтение всех записей;

О — чтение метаданных;

больше 0 — читается указанное количество записей от начала набора данных;

function HandleUpdateError(Tree: TUpdateTree; Е: EUpdateError; var MaxError, ErrorCount: Integer): Boolean; — выполняет обработку ошибок, которые возникли при обновлении набора данных. Назначение параметров:

Tree — обновляемые записи; Е — идентификатор ошибки; MaxError — максимально допустимое количество ошибок; ErrorCount — фактическое количество ошибок; procedure LogUpdateError(Tree: TUpdateTree; Е: EUpdateError; Response: TResolverResponse); — регистрирует в журнале ошибок неправильную запись. Назначение параметров Tree и Е аналогично предыдущему методу. Параметр содержит одну или несколько констант, характеризующих каждую запись набора данных:

rrSkip — запись пропущена;

rrAbort — изменение набора данных прекращено;

ггМе^е — ошибочная запись отвергнута и сохранена предыдущая версия записи; ггЛрр1у — успешное обновление записи; гг^поге — ошибка проигнорирована.

Контрольные вопросы

  • 1. Укажите отличия трехзвенного варианта от двухзвенного варианта архитектуры «клиент—сервер».
  • 2. Расскажите о назначении каждого уровня в трехзвенной архитектуре «клиент—сервер».
  • 3. Перечислите преимущества трехзвенной архитектуры «клиент—сервер».
  • 4. Расскажите о процедуре создания сервера приложений.
  • 5. Расскажите о назначении и основных свойствах компонента ТОа1аБе1Р гоу1с1ег.
 
< Пред   СОДЕРЖАНИЕ     След >