LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 52. Репликация базы данных

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         17.02.2006
Сайт:         http://www.leadersoft.ru
Автор:       Анатолий


Новости сайта
    Есть профессиональное решение по репликации удаленных баз данных. База данных автоматически делается реплицируемой, архивируется и защищается паролем. Информация отсылается на сайт в Интернете. Любой офис имея пароль и доступ к сайту и архиву может скачать данные и синхронизовать их с офисной базой. Таким образом, такое решение значительно упрощает взаимодействие разных офисов.
   Конференция по базам данных: http://leadersoft.ru/russian/help/conference/conf1.htm
   Аутсорсинг по базам данных: http://leadersoft.ru/russian/all/01/

Введение в тему  
        По репликации базы данных дано не так уж и много информации. Что это такое. Репликация - это синхронизация записей (и структуры) базы данных. Например, у Вас есть 2 офиса, 2 удаленных склада необходимо синхронизовать эти данные таким образом, чтобы заказы и складские остатки были одинаковыми в офисах и на складах. Один из вариантов - это разместить базу в интернете. Сделать на сайте систему заказов, но возникает проблема. Нужно постоянно защищать базу данных от взлома, да и интерфейс и отчетность сайта будут иметь ограничения по сравнению с решением выполненном на Access. В этом приложении больше возможностей по поиску и работе с данными и отчетами типа Excel и Word.

Варианты решения
   Для работы с базами данных Access (.mdb) была разработана модель, которая получила название Microsoft® Jet and Replication Objects (JRO). В этой статье мы рассмотрим, как с помощью JRO сделать базу данных реплицируемой, научимся создавать различные типы реплик, а также синхронизировать их между собой.

Первый шаг - сделаем базу реплицируемой. Функция для этого может выглядеть так:

Private Function MakeRecordLevelDesignMaster(strDBPath As String)
Dim repMaster As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия
   repMaster.MakeReplicable strDBPath, False 'делаем базу данных реплицируемой
   Set repMaster = Nothing 'удаляем переменную из памяти
End Function
Метод MakeReplicable([ConnectString] [, ColumnTracking])имеет два параметра. Первый - это путь к базе данных, которую мы делаем реплицируемой. Второй параметр рассмотрим подробнее. Он может принимать два значения True (по-умолчанию) или False . В нашем примере установлено значение False. Это значит, что при синхронизации реплик конфликты будут отслеживаться на уровне записи. Если установлено значение True, то конфликты будут отслеживаться на уровне столбца. Например, два пользователя в разных репликах изменяют различные поля одной записи. Если  значение параметра установлено False (уровень записи), то при синхронизации возникнет конфликт. Хотя на самом деле конфликта нет, ведь данные различных столбцов не связаны между собой. Избежать такого конфликта можно установив значение параметра True (уровень столбца). Тогда конфликт при синхронизации возникнет только в том случае, если оба пользователя изменят один и тот же столбец одной и той же записи. Таким образом, использование отслеживания конфликтов на уровне столбца позволяет произвести синхронизацию с наименьшим количеством ошибок, хотя и прибавит системе немного работы. Возможность  отслеживания конфликтов на уровне столбца есть только в JRO, в DAO ее нет. Это надо учесть при проектировании базы данных

По умолчанию, все объекты базы делаются реплицируемыми, т.е. при синхронизации будут обновляться данные во всех таблицах. Если вы хотите чтобы объект базы данных был локальным (при синхронизации данные не обновляются),  надо задать ему это свойство до объявления базы реплицируемой. Это можно сделать так:

Private Function KeepObjectLocal(strDBPath As String, strObjectName As String, strObjectType As String)
Dim repMaster As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия

   repMaster.ActiveConnection = strDBPath 'Связываем переменную с базой данных
   repMaster.SetObjectReplicability strObjectName, strObjectType, False 'делаем объект  strObjectName, который имеет тип strObjectType локальным (False) или реплицируемым (True)

Set repMaster = Nothing 'удаляем переменную из памяти
End Function

Пример вызова функции Call KeepObjectLocal("C:\<Путь к базе данных>\<Имя файла>", "Клиенты", "Tables")

Второй шаг - создание реплики. Для создания реплики используем метод CreateReplica.
Function MakeNewReplica(strReplicableDBPath As String, strDescription As String) As Integer
Dim repReplicableDB As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия
Dim strNewReplicaDBPath As String 'определяем переменную - имя новой реплики

   strNewReplicaDBPath = "C:\<Путь к базе данных>\<Имя файла>"  'получаем имя новой реплики
   repReplicableDB.ActiveConnection = strReplicableDBPath 'Связываем переменную с базой данных
   repReplicableDB.CreateReplica strNewReplicaDBPath, strDescription, jrRepTypeFull, jrRepVisibilityGlobal 'Создаем реплику
   Set repReplicableDB = Nothing 'Удаляем переменную с памяти
End Function

Метод CreateReplica (ReplicaName, Description [, ReplicaType] [, Visibility]  [, Priority] [, Updatability]) имеет такие параметры:

1. ReplicaName - путь и имя новой реплики

2. Description - описание реплики

3. ReplicaType - тип реплики. В нашем примере jrRepTypeFull - полная реплика. (не обязательный параметр)

4. Visibility - видимость реплики. В нашем примере jrRepVisibilityGlobal  - глобальная реплика, т.е. в реплике "видны" все данные из главной реплики (не обязательный параметр)

5. Priority - приоритет реплики. В нашем примере этот параметр опущен. Это значит, что приоритет присваивается автоматически. (не обязательный параметр)

6. Updatability - показывает разрешается ли пользователям менять схему и записи реплицируемых объектов реплики. В нашем примере параметр опущен. Это значит, что               разрешаются изменения. (не обязательный параметр).

 

Давайте рассмотрим какие еще значения могут принимать параметры метода CreateReplica.

ReplicaType может принимать значения

jrRepTypeNotReplicable По умолчанию. База данных не реплицируемая.
jrRepTypeDesignMaster Реплика - владелец проекта.
jrRepTypeFull Полная реплика.
jrRepTypePartial Частичная реплика.

 

При создании полной реплики импортируются все данные из реплицируемых объектов главной реплики. При создании же частичной - согласно заданному фильтру. При синхронизации данные обновляются также согласно этому фильтру. Если в результате обновления данные поменялись таким образом, что перестают соответствовать фильтру, запись при последующих синхронизациях не обновляется. Вот пример функции, которая создает частичную реплику

Function CreatePartial(strReplicableDBPath As String, strDescription As String)

Dim repFull As New JRO.Replica
Dim repPartial As New JRO.Replica
Dim strPartialDBPath As String

  strPartialDBPath = "C:\<Путь к базе данных>\<Имя файла>"  'получаем имя новой реплики
 

  'Создаем пустую реплику
  repFull.ActiveConnection = strReplicableDBPath
  repFull.CreateReplica strPartialDBPath, strDescription, jrRepTypePartial, jrRepVisibilityGlobal

  Set repFull = Nothing 'Удаляем переменную с памяти

  'Соединяемся с созданной репликой в эксклюзивном режиме
  repPartial.ActiveConnection = "Data Source=" & strPartialDBPath & ";Mode=Share Exclusive"

  'Создаем фильтр на основе таблицы (параметр jrFilterTypeTable)

  repPartial.Filters.Append "Клиенты", jrFilterTypeTable, "[Страна] = 'США'"
  repPartial.Filters.Append "Товары", jrFilterTypeTable, ""

  'Создаем фильтр на основе связей между таблицами (параметр jrFilterTypeRelationship)

  repPartial.Filters.Append "Заказы", jrFilterTypeRelationship, "КлиентыЗаказы"

  'Импоритруем данные согласно фильтра в реплику

  repPartial.PopulatePartial strReplicableDBPath

  Set repPartial = Nothing 'Удаляем переменную с памяти  
End Function
 

 Visibility - может принимать значения

JrRepVisibilityGlobal Глобальная реплика.
JrRepVisibilityLocal Локальная реплика.
JrRepVisibilityAnon Анонимная реплика.

 

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

Локальные и анонимные реплики могут синхронизироваться только с родительскими репликами. Их приоритет всегда равен 0, поэтому, если возникает конфликт при синхронизации, всегда принимаются изменения сделанные в родительской реплике. Если же конфликта нет, то принимаются изменения сделанные в локальной или анонимной реплике. Отличия между локальной и анонимной репликой состоят в следующем. Путь к локальной реплике всегда хранится в главной реплике. Таким образом главная реплика может инициировать синхронизацию с локальной репликой. О местоположении анонимной реплики главной реплике ничего не известно. Поэтому начать процесс синхронизации может только анонимная реплика. Анонимные реплики чаще всего используются для синхронизации через интернет, когда их количество велико, а местоположение не фиксировано. Использование анонимной реплики также позволяет уменьшить размер базы данных.

 

Priority - это параметр который позволяет установить приоритет реплики. Приоритет реплики - еще одно новшество JRO. Этот параметр введен для того, чтобы показать относительное превосходство одной из реплик во время синхронизации: всегда принимаются изменения, сделанные в реплике с большим приоритетом. Почему относительное превосходство? Потому что, хотя изменения и принимаются, конфликт фиксируется и если он не обработан программно, при последующем обращении к  реплике вызывается мастер решения конфликтов. Он позволяет пользователю принять сделанные изменения или отменить их.

Приоритет реплики может принимать значение от 0 до 100 и устанавливается при создании реплики. Владелец проекта имеет приоритет 100. Далее, если при создании глобальной реплики приоритет не указан явно (как в нашем примере) то он принимается равным 90% от приоритета родительской. Как говорилось выше, приоритет локальной и анонимной реплики всегда равен 0. При синхронизации реплик с одинаковым приоритетом принимаются измения, сделанные в той реплике, у которой самый низкий ReplicaID - свойство, которое присваивается реплике автоматически при создании.

 

Updatability - может принимать значения

jrRepUpdFull Реплика может быть обновлена.
jrRepUpdReadOnly Реплика только для чтения.

 

По умолчанию принимается значение jrRepUpdFull. Если установлено значение jrRepUpdReadOnly то пользователю не разрешается изменять данные в реплике. Однако при синхронизации с другими репликами изменения данных принимаются.

Третий шаг - синхронизация двух реплик.

 

Private Function TwoWayDirectSync(strReplica1 As String, strReplica2 As String)
Dim repReplica As New JRO.Replica  'определяем переменную с которой в дальнейшем будем производить все действия

repReplica.ActiveConnection = "Data Source=" & strReplica1 & ";Mode=Share Exclusive"   'связываем переменную с репликой strReplica1

repReplica.Synchronize strReplica2, jrSyncTypeImpExp, jrSyncModeDirect  'синхронизируем реплику strReplica1 с репликой strReplica2

Set repReplica = Nothing   'Удаляем переменную с памяти  
End Function
 

Метод Synchronize(Target [, SyncType] [, SyncMode]) имеет такие параметры:

 

1.  Target - путь к реплике с которой проводим синхронизацию.

2. SyncType - тип синхронизации (не обязательный параметр).

3. SyncMode - режим синхронизации (не обязательный параметр).

 

Рассмотрим второй и третий параметры подробнее.

SyncType - может принимать значения

jrSyncTypeExport

Отправлять изменения сделанные в текущей реплике.

Изменения, сделанные в реплике

Target игнорируются.

jrSyncTypeImport Принимать изменения сделанные в реплике Target.

Изменения, сделанные в текущей реплике игнорируются

jrSyncTypeImpExp По умолчанию. Принимаются изменения сделанные в обеих репликах.

SyncMode - может принимать значения

jrSyncModeIndirect По умолчанию. Косвенная синхронизация.
jrSyncModeDirect Прямая синхронизация.
jrSyncModeInternet Косвенная синхронизация через интернет.

Во время прямой синхронизации двух реплик они открываются одновременно и данные передаются непосредственно из одной реплики в другую. При косвенной синхронизации открывается одна реплика, изменения собираются и помещаются в отдельный файл. Затем открывается вторая реплика и читает эти изменения. Прямую синхронизацию используют когда обе реплики находятся в одной локальной сети. При дозвоне и других ненадежных соединениях, когда связь может внезапно оборваться необходимо использовать косвенную реплику. Также, косвенную синхронизацию применяют через интернет (значение jrSyncModeInternet). При этом параметр Target имеет вид к примеру такой: "www.mycompany.myserver.com/files/Orders.mdb "

Таким образом, средства репликации широко представлены в Access и дают большие возможности создателям баз данных для использования репликации в своих проектах.