Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование для начинающих и не только


Информационный Канал Subscribe.Ru


Разработка многоуровневых приложений

Многим программистам заведующим сетями больших и средних размеров очень часто требуется организовать доступ к Серверу БД большого количество клиентских приложений собственной разработки. Одно из очевидных решений этого задания - копирование BDE или другого аналогичного продукта на все клиентские машины и подсоединение его к базе. Но есть и другой, более компактный и "культурный" способ предоставить клиентским приложениям доступ к данным - MIDAS.

MIDAS - что это такое?

MIDAS - multi-tired distributed application service suite. Это технология Borland для создания трехуровневых приложений баз данных. Применение данной технологии позволяет в быстро разрабатывать простые в сопровождении и надежные распределенные БД, которые почти не зависят от формата хранения данных на сервере. Эти трехуровневые приложения состоят из следующих компонентов(слоев)(рис.1):

  1. Первый, самый нижний слой - слой СУБД. Это может быть любая из имеющихся на рынке Систем управления базами данных (Oracle,Interbase,MS SQL,MySQL,Sybase,Paradox.....). Назовем его уровень БД, он же сервер БД.
  2. Средний слой - слой бизнес логики и транспортный слой. Посредством этого компонента осуществляется доступ клиентов к данным хранимым в слое БД: передача запросов, результатов, проверка на правильность вносимых данных, обновление данных. Транспортный уровень, он же сервер приложений.
  3. Самый верхний слой - клиентское приложение. Которое используя механизмы транспортного уровня отображает данные в необходимой для клиента форме.Он же клиент.
Применение данной технологии позволяет создать клиентское практически не требующее настройки. Оно может доже и не знать о способе физического хранения данных на сервере. Технология MIDAS как раз и предназначена для реализации связи между транспортным уровнем и клиентским приложением.

Доступ

MIDAS предоставляет несколько протоколов для связи транспортного и клиентского уровня. Это:

  • DCOM
  • Socket
  • Web
  • Corba

DCOM

Этот режим связи основан на использовании встроенных возможностей Windows. Из достоинств этого метода можно выделить такие:

  • Встроенная поддержка в Windows98/2000/XP/NT. Может быть установлен и на Win95 как отдельное приложение.
  • Не требует запуска дополнительных приложений на стороне сервера для управления подключением клиентов.
  • Реализована возможность автоматического запуска сервера при обращении к нему клиента и его выгрузка при отсутствии обрещений.
  • Недостатки:
  • Существуют проблемы с работой DCOM в сетях с контролером домена не NT. Т.е. полноценное функционирование DCOM-приложений возможно только на базе серверных версий Windows NT,2000....
  • Отсутствует возможность создания прозрачности положения сервера. Т.е. клиент должен явно указать на какой машине в сети установлен сервер.
  • Использовать DCOM можно только на Windows платформах.

Socket

Один из простейших случаев реализации связи. В его основе лежит использование сокетов и протокола TCP/IP.

    Достоинства:
  • Может функционировать на любой платформе, использующей TCP/IP.
  • Требует минимум установленных компонентов в системе.
  • Недостатки:
  • Требует дополнительного приложения установленного на сервере для постоянного отслеживания запросов клиентов.
  • Отсутствие механизма обеспечения безопасности. Другими словами все серверы приложений на этой машине могут быть использованы любым клиентом имеющем доступ к TCP/IP.

Web

Основан на протоколе HTTP. Незаменимая вещь при необходимости обеспечения доступа к данным из вне.

    Достоинства:
  • Позволяет организовать возов объекта с машины находящейся за пределами сегмента сети.
  • Недостатки:
  • Требует установки на стороне клиента wininet.dll
  • Требует Веб сервер IIS 4.0 (или выше), или другие серверы поддерживающие эту технологию.<.LI>

CORBA

Полностью независимый от ОС стандарт функционирования приложений в распределенной сети.

    Достоинства:
  • Независимость от ОС
  • Позволяет полностью реализовать механизм прозрачности положения сервера.
  • Возможность выбора между автоматическим и ручным запуском сервера приложений
  • Недостатки:
  • Требуется установка дополнительного программного обеспечения (брокера объектных запросов).
  • Более сложная установка и настройка сервера приложений для автоматического запуска.
  • Использование в Delphi COM для реализации CORBA.

Практика

Для демонстрации функционирования технологии MIDAS мы воспользуемся любым средством разработки Borland (Delphi 5,6,7, C++Builder 5,6...), которое поддерживает разработку данного типа приложений. Кроме того нам понадобятся базы данных к которым мы будем предоставлять доступ нашим клиентам можно (для нашего первого приложения мы воспользуемся набором данных входящих в состав продуктов Borland).

Постановка задачи

Так как мы создаем демонстрационное приложение, при помощи которого потом будем расширять наши познания MIDAS, то для начала мы создадим простенький сервер, который будет предоставлять нам доступ к одной конкретной таблице. Кроме того, мы создадим клиент для отображения данных из таблицы заданной на сервере.

Сервер

Создание простенького MIDAS сервера в средствах разработки Borland не предоставляет никакой сложности (вот тут как раз в полной мере реализована методика разработки приложений без ручного написания кода) .

Для начала откроем одно из средств разработки Borland, к примеру Delphi. После чего выберем пункт создания нового приложения и создадим для нашего сервера библиотеку ActiveX(рис.2).

Для этих целей можно также создать приложение (New->Application). После этого нам понадобится еще раз заглянуть в пункт меню New, но теперь уже для того чтоб создать удаленный модуль данных (Remote Data Module, рис.3);

и после того как в нашем проекте появился модуль, мы перетаскиваем на него главный связующий объект DataSetProvider из палитры Data Access, а также компонент TTable (кроме него могут использоваться любые другие компоненты для работы с БД, TQuery,TStoredProc и т.п.). В нашем же случае достаточно будет и одного TTable(рис.4).

Теперь настроим наш TTable на работу с некоторой базой данных посредством задания(или выбора из списка) значений свойств DatabaseName и TableName(рис.5). Далее мы свойство Table1.Active равным "true" и переходим к настройке провайдера. Здесь также прилагая минимум усилий мы заполняем свойство DataSet компонента DataSetProvider1 и регистрируем наш сервер (Run->Register ActiveX Server).

Все, на этом разработка сервера приложений закончена. И как видим, мы обошлись без ввода единой строки кода, все было сделато автоматически средой разработки.


Клиент

Для создания клиента в этот раз мы при создании приложения выберем пункт Application, и после появления на экране формы примемся перетаскивать на нее необходимые компоненты. Итак, для непосредственной связи с сервером приложений на стороне клиента мы можем использовать следующие компоненты:

  • DCOMConnection
  • SocketConnection
  • WebConnection
  • CorbaConnection
Которые для взаимодействия с сервером используют почти одноименные протоколы.

Так как мы пока тренируемся и у нас клиент и сервер находятся на одном компьютере, то для связи мы воспользуемся первым из перечисленных компонентом. Здесь при настройке DCOMConnection нам понадобится написать от руки только одно свойство - ComputerName (в нашем случае - localhost).(рис.6).

Далее мы опять беремся за мышь и переходим к заполнению свойств ServerName и ServerGUID. Сначала из ниспадающего меню при ServerName выбираем наш вариант (если вы еще не занимались разработкой подобных приложений, то в списке будет только один наш проект с названием подобным рис.7,

которое назначается объекту по шаблону <имя библиотеки ActiveX . имя сервера>).После этого выбора среда разработки сама вставит необходимый идентификатор в поле ServerGUID. Последее приготовление компонента DCOMConnection к работе осуществляется его активизацией (DCOMConnection1.Active = true). Теперь если никаких ошибок не возникло, мы с уверенностью можем сказать, что сервер настроен нормально.

Для дальнейшей работы мы перетащим с палитры компонентов DataAccess компонент TClientDataSet который и будет представлением удаленного набора данных на стороне клиента. Для задействования компонента ClientDataSet мы должны установить его свойства RemoteServer и ProviderName (порядок установки значений этих свойств имеет существенное влияние на дальнейшее поведение ClientDataSet). Так из ниспадающего меню при свойстве RemoteServer мы выбираем значение того связующего компонента (если их несколько), который настроен на необходимый сервер. В нашем случае в этом списке будет только один компонент DCOMConnection1 который мы и выбираем. После этого примемся за установку значения свойства ProviderName. Как вы помните при разработке сервера приложений мы поместили в RemoteDataModule компонент TDataSetProvider. Теперь же, при разработке клиента мы из ниспадающего списка выбираем его и заносим в свойство ProviderName(рис.8). Теперь нам остается перетащить на форму компонент который будет отображать полученные данные (например TDBGrid) и компонент TDataSource. После настройки всех необходимых параметорв (DataSource.DataSet, DBGrid.DataSource). Мы готовы вывести наши данные на форму, для этого установим значение свойства Active компонента ClientDataSet в True. Результат приведен на рис.9ю При этом мы даже не запустили наше приложение-клиент, но уже удостоверились в его работоспособности.


Работа с данными

Модель "портфеля"

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

Модель портфеля основывается на двух методах компонента ClientDataSet:

  • procedure SaveToFile(const FileName: string = ''; Format TDataPacketFormat=dfBinary);
  • procedure LoadFromFile(const FileName: string = '');
Первый из представленных методов сохраняет полученные данные в локальном файле в соответствующем формате. Второй из приведенных методов соответственно загружает сохраненные данные. Если надо работать с 2-мя таблицами, то их необходимо сохранять в 2-х отдельных файлах (или чтоб не засорять диск большим количеством файлов воспользоваться COM-хранилищами и методами ClientDataSet.SaveToStream и ClientDataSet.LoadFromStream).

Сам процесс записи и считывания данных с локального диска чрезвычайно прост, однако для правильной работы с "портфелем" необходимо принять во внимание некоторые моменты.

Свойство PacketRecords

Свойство PacketRecords - одно из важнейший свойств компонента ClientDataSet. Основное его предназначение - установка количества записей, которые могут быть переданы сервером в одном пакете. При создании экземпляра класса TClientDataSet это свойство автоматически принимает значение -1, что означает передачу сразу всех данных в одном пакете. Установка значения свойства PackerRecords в 0 - информирует сервер о том, что для клиенту необходимы только метаданные базы дынных (Информация о самой БД, описания таблиц, названия, типы используемых полей...).

Если же значение свойства больше 0, то информация передается сервером по запросу несколькими пакетами, где в каждом пакете размещается не больше записей. Это удобно во многих случаях, особенно при низкой пропускной способности сети (или связи по модему). Но установка значения 1 и больше не подходит для работы по "портфельному" методу. Вместо этого при использовании модели "портфеля" мы оставим значение свойства PacketRecords по умолчанию (-1). При этом все останется по прежнему, кроме того полный набор данных на сервере будет доступен все время. С другой стороны этот подход не очень практичен при использовании больших объемов данных.

Обновление данных

Для сохранения одной или более отредактированных записей при использовании удаленного набора данных надо вызвать метод ApplyUpdates:


function ApplyUpdates(MaxErrors: Integer): Integer; virtual;
Присвоение параметру MaxErrors значения проинформирует компонент о том, что сервер не должен останавливать процесс обновления данных количестве ошибок меньшем MaxErrors. Установка значения -1 говорит о том, что вы не хотите останавливать процес обновления при возникновении ошибок. Но в случае возникновения ошибок метод ApplyUpdates возвращает значение равное их количеству.

После того, как вы внесли свои изменения в удаленную БД, возможно вы захотите обновить свой набор данных с тем чтобы посмотреть изменения внесенные в базу другими пользователями. Для этого используется метод Refresh входящий в TDataSet. Типичный пример обновления:


if ClientDataSet1.ApplyUpdates(-1) = 0 then   ClientDataSet1.Refresh;

Последние замечания

Итак теперь вы уже знаете, как организовать в своей сети (или у себя на одном компьютере) полнофункциональное трехуровневое приложение Клиент-Сервер, и тем самым облегчить себе последующую настройку и сопровождение своего приложения, а также задействование новых клиентских машин с минимумом затрат рабочего времени и ресурсов аппаратуры. Под конец хотелось бы с вашего позволения дать несколько советов для тех кто сразу же бросился писать код. Не спешите, сначала определитесь с тем, что вы хотите видеть в вашем приложении, и в зависимости от поставленных задач выберите приемлемый способ связи и представления данных. Вот несколько советов по выбору протокола передачи данных:

  • Если вы в первый раз занимаетесь разработкой приложения такого уровня, то можно посоветовать использовать DCOM, установив сервер приложений на и клиента на одной машине.
  • Если ваша БД будет использоваться только с ОС Windows с контролером домена NT - смело используйте DCOM
  • Если вы не уверены в платформе или в том что в сети есть NT домен можете воспользоваться протоколом CORBA или Сокетами.
  • Если же необходимо обеспечить распределение нагрузки на несколько компьютеров и заранее неизвестны их имена и адреса (или они могут изменятся), то воспользуйтесь технологией CORBA
  • Если вы желаете предоставить доступ к данных из вне, то вам не обойтись без WebConnection. Но здесь следует также позаботится и о Веб-сервере поддерживающем данную технологию
  • Если же вам необходимо в кратчайшие строки организовать многослойную БД и вы не хотите забивать себе голову внушающими перечнями настроек и правами доступа Corba и DCOM, то SocketConnection как раз то, что вам нужно.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное