Transcript
Page 1: Distributed Geodatabase Development-best Practices

Khaled HassenGary MacDougall

Distributed Geodatabase Development (Best Practices)

Page 2: Distributed Geodatabase Development-best Practices

Schedule

• 75 minute session– 60 – 65 minute lecture– 10 – 15 minutes Q & A following the lecture

• Cell phones and pagers

• Please complete the session survey – we take your feedback very seriously!

Page 3: Distributed Geodatabase Development-best Practices

Prerequisites

• Prerequisites– Understand versioning– Have reviewed the geodatabase replication on-line help and

developer documentation

• All code examples and demos are in C#

Page 4: Distributed Geodatabase Development-best Practices

Overview

• Distributed geodatabase use cases and techniques• Geodatabase replication

– Replication introduction– Replication internals and developer API– DEMO: Replica creation with custom workspace extension

• Interoperability with non-geodatabase formats

Page 5: Distributed Geodatabase Development-best Practices

Distributed Geodatabase Use Cases

• Mobile Users and Field Crews who need to be disconnected from the network

• Users who need to maintain copies of data at different organizational levels (city, county, state)

• Users who want to maintain copies of data at different geographic facilities

• Users who need to distribute work to contractors

• Production and publication geodatabases

Page 6: Distributed Geodatabase Development-best Practices

Distributed Geodatabase Use Cases

ParentParentParentParent Office

OfficeOffice

Office

Office Office

ProductionGeodatabase

Readers

ArcIMS ArcGISServer

Editors

PublicationGeodatabase

Main Office

Regional Office

LocalOffice

LocalOffice

Regional Office

Regional Office

LocalOffice

LocalOffice

LocalOffice

LocalOffice

LocalOffice

LocalOffice

LocalOffice

Multiple levels

Mobile UsersRegional Offices

Production / Publication

Page 7: Distributed Geodatabase Development-best Practices

Data Copying and Loading

• Involves simply using data copying and export/import tools to copy data from one geodatabse to another

• Works well for systems with simple requirements– Example: A field worker updates a feature class and simply

needs to copy that feature class to the ArcSDE geodatabase in the office each night

• Limitations– No safeguard against data lose– No safeguards against data redundancy

Page 8: Distributed Geodatabase Development-best Practices

DBMS Replication with Geodatabases

• Requirements and limitations– Requires knowledge of how the geodatabase\ArcSDE system

tables work – No tools provided in ArcGIS to support it– Limited support for cross DBMS replication– Does not support or has limited support for complex

geodatabase data types and limited filters to define the data toreplicate

• Advantages– Can work with non-versioned data– Can replicate entire database– Can be configured to provide synchronous replication

Page 9: Distributed Geodatabase Development-best Practices

Geodatabase Replication

• Allows you to distribute copies of data across 2 or more geodatabases

• You can edit the databases independently and synchronize them as needed

• Uses geodatabase connections directly (LAN) or using geodata services publish on ArcGIS server (WAN)

• Works in a connected and a disconnected environment

• Can replicate subsets and uses versioning

• Released at 9.2 - Builds upon disconnected editing from earlier releases (8.3)

Page 10: Distributed Geodatabase Development-best Practices

Geodata Services: replica types

One-way

Two-wayMultiple times

editsChild

geodatabaseParent

geodatabase

Multiple times

edits

Child geodatabase

Parentgeodatabase

Checkout/ check-in

Once only

editsChild

geodatabaseParent

geodatabase

Page 11: Distributed Geodatabase Development-best Practices

Geodatabase Replication Workflows

• Workflows can involve Multi-User geodatabasesand single user geodatabases

– Multi-user geodatabase –Multi-user ArcSDEgeodatabase accessed locally or remotely through ArcGIS server

– Single user geodatabase –Personal ArcSDE, file geodatabase or personal geodatabase on a local machine

MultiMulti--user to Multiuser to Multi--useruser

EnterpriseEnterprise EnterpriseEnterprise

MultiMulti--user to Single Useruser to Single User

Personal Personal GeodatabaseGeodatabase, , File File GeodatabaseGeodatabase oror

PeronalPeronal ArcSDEArcSDE

EnterpriseEnterprise

Page 12: Distributed Geodatabase Development-best Practices

Data distribution inEnterprise systems

• Geodata services can be used in conjunction with other data distribution techniques

• Scenario

Web services

– Use Mobile services for field workers with lightweight mobile devices

– Use geodata services for field workers who need ArcGIS Desktop or ArcGIS Engine in the field

Regionoffice

– Use geodatabase replication to synchronize changes between offices

Mainoffice

A

Page 13: Distributed Geodatabase Development-best Practices

9.3 9.3 GeodatabaseGeodatabase ReplicationReplication

• Feedback from many clients• Improve quality

– Added many bug fixes and enhancements to improve quality and performance

– Added logging to improve trouble shooting– Added white paper

• Enhancements based on feedback from clients implementing replication– Enhanced one way replication to support replicating to file

geodatabases and personal geodatabases– User defined globalids (API)– Make it easier to generate updategrams (API)

Page 14: Distributed Geodatabase Development-best Practices

Geodatabase Replication – Getting Started

• Anticipate future needs when defining the data to replicate

• Have a well defined data model before creating replicas• Choose the right replica type

– Consider 2 way replicas with personal ArcSDE instead of check-out replicas

– Use 1 way replicas over 2 way replicas when possible

Page 15: Distributed Geodatabase Development-best Practices

Geodatabase Replication – Getting Started

• Use models or scripts for replicas you plan to create on a regular basis– You can use the create replica and create replica from server

geoprocessing tools to build models

• Consider using the following replica creation options– Re-use schema (check-out replicas) – uses existing schema– Register only – replicates pre-copied data– Relationship classes processing is optional

• Schedule Synchronizations– You can use geoprocessing models exported to python and the

windows scheduler– Consider synchronization order

Page 16: Distributed Geodatabase Development-best Practices

Geodatabase Replication – Getting Started

• Integrate synchronization with version management strategy – Synchronize before running reconcile and compress services– Reconcile service should cover replicas with a manual reconcile

policy

• Network speed– Use geodatabases directly over fast networks (LAN) – Use ArcGIS server and geodata services on slower networks

(WAN – i.e. DSL)– Use disconnected synchronization techniques over very slow

networks (slow dial-up modem) or where there is no network connectivity

Page 17: Distributed Geodatabase Development-best Practices

When to write code

• Basic creation and synchronizations using geoprocessing models require little or no coding

• Write code when…– Integrate geodatabase replication into larger applications

• Example: integrate synchronization with reconcile service– Extend the replica creation and synchronization process– Methods and properties not exposed through the UI or geoprocessing

tools• Recommended synchronization order• Browse changes before synchronization• Advanced replica creation options• Export and Import version differences

Page 18: Distributed Geodatabase Development-best Practices

Geodatabase Replication – API

• GeoDatabaseDistributed library• Coarse Grained API (Recommended)

• GeoDataServer Object Model – new at ArcGIS 9.2• Stateless object model • Geodatabase replication, browsing, querying, data

extraction • Fine grained API

• Pre-ArcGIS 9.2 object models– Data Extraction and Check out/Check in Object Model, XML Export and

Import Object Model

• Object models for specialized operations such as browsing the contents of a delta file

– Data Changes Object Model, Schema Change Export and Import Object Model

Page 19: Distributed Geodatabase Development-best Practices

Geodatabase Replication – API

Coarse Grained API(GeoDataServer object model)

Fine Grained API(Data Extraction Check out/ Check in object model; XML

Export and Import Object Model; Data Changes Object

Model; Schema Change Export and Import Object

Model)

Geodatabase DistributedLibrary

RemoteGeodatabase

LocalGeodatabase

Internet

Local

Local

Page 20: Distributed Geodatabase Development-best Practices

Supports Connected and Disconnected Environments

• Connected– All replicas accessible on the network (LAN or WAN)– Always connected or intermittently connected

• Example: to synchronize, use the synchronize wizard in ArcCatalog

• Disconnected– Replicas are not on the same network– Message exchange is performed by the end user– Operations are performed by export, file transfer and import

• Example: to synchronize, export changes to a delta XML file, transfer the file (ftp, CD through the mail, etc.), have the file imported on the relative replica when it arrives, send acknowledgement message back to sender

Page 21: Distributed Geodatabase Development-best Practices

Connected and Disconnected Environments

GeoDataServer1

ReplicationAgent

GeoDataServer2

Geodatabase Geodatabase

GeoDataServer1(proxy)

ReplicationAgent

GeoDataServer2(proxy)

Geodatabase

GeoDataServer2

Geodatabase

GeoDataServer1

Internet Internet

GeoDataServer1 GeoDataServer2

XML XML

Geodatabase Geodatabase

GeoDataServer1(proxy)

GeoDataServer2(proxy)

XML XML

Geodatabase

GeoDataServer2

Geodatabase

GeoDataServer1

InternetInternet

Connected DisconnectedLAN

WAN (ArcGIS Server)

LAN

WAN (ArcGIS Server)

Page 22: Distributed Geodatabase Development-best Practices

Geodatabase Replication API

• Replica creation

• Replica synchronization

• Replication extensibility

• Optimization, performance and best practice

Page 23: Distributed Geodatabase Development-best Practices

Example: Create Replica in a Connected Environment

• Steps Initialize a GeoDataServer for the source and target geodatabasesCreate a GPReplicaDescription to define the data to be replicate from the sourceUse the GPReplicaOptionsClass to define replica options such as the replica typeUse the ReplicationAgent to create the replica

Page 24: Distributed Geodatabase Development-best Practices

IGeoDataServer iGDS = new GeoDataServerClass();

IGeoDataServerInit iGDSInit = iGDS as IGeoDataServerInit;

iGDSInit.InitFromConnectionString("SERVER=bobmk;INSTANCE=5151;

VERSION=sde.DEFAULT;USER=gdb;PASSWORD=gdb");

IGeoDataServer iGDS = new GeoDataServerClass();

IGeoDataServerInit iGDSInit = iGDS as IGeoDataServerInit;

iGDSInit.InitFromConnectionString("SERVER=bobmk;INSTANCE=5151;

VERSION=sde.DEFAULT;USER=gdb;PASSWORD=gdb");

Initializing GeoDataServers

GeoDataServers represent local or remote geodatabases– Local geodatabases are initialized directly– Remote geodatabases are accessed from geodata services

published by ArcGIS server on the internet

Accessing a geodata service on the internet

Initializing from a local geodatabase

IPropertySet iCProps = new PropertySetClass();

iCProps.SetProperty("URL",@"http://baza/arcgis/services");

IAGSServerConnectionFactory iSCF = new AGSServerConnectionFactoryClass();

IAGSServerConnection iSvrConn = iSCF.Open(iCProps, 0);

IAGSServerObjectName iSObjName = null;

While ((iSObjName = iSvrConn.Next()) != null) {

if (iSObjName.Name == “Sample_GeoDataService") return iSObjName; }

IPropertySet iCProps = new PropertySetClass();

iCProps.SetProperty("URL",@"http://baza/arcgis/services");

IAGSServerConnectionFactory iSCF = new AGSServerConnectionFactoryClass();

IAGSServerConnection iSvrConn = iSCF.Open(iCProps, 0);

IAGSServerObjectName iSObjName = null;

While ((iSObjName = iSvrConn.Next()) != null) {

if (iSObjName.Name == “Sample_GeoDataService") return iSObjName; }

Page 25: Distributed Geodatabase Development-best Practices

public IGPReplicaDescription CreateReplicaDescription(IGeoDataServer iGDS)

{

IGPReplicaDescription iGPRDescripton = new GPReplicaDescriptionClass();

IGPReplicaDatasets iGPRDatasets = new GPReplicaDatasetsClass();

IGPReplicaDataset iGPRDataset = new GPReplicaDatasetClass();

iGPRDataset.Name = “Roads”; iGPRDataset.Type = “esriDTFeatureClass”;iGPRDatasets.Add(iGPRDataset);

try {

IGPReplicaDatasets iERDatasets =

iGDS.ExpandReplicaDatasets(iGPRDatasets);

}

catch (Exception e) { return null; }

iGPRDescription.GPReplicaDatasets = iERDatasets;

iGPRDescription.SingleGeneration(false);

…return iGPRDescription;

}

public IGPReplicaDescription CreateReplicaDescription(IGeoDataServer iGDS)

{

IGPReplicaDescription iGPRDescripton = new GPReplicaDescriptionClass();

IGPReplicaDatasets iGPRDatasets = new GPReplicaDatasetsClass();

IGPReplicaDataset iGPRDataset = new GPReplicaDatasetClass();

iGPRDataset.Name = “Roads”; iGPRDataset.Type = “esriDTFeatureClass”;iGPRDatasets.Add(iGPRDataset);

try {

IGPReplicaDatasets iERDatasets =

iGDS.ExpandReplicaDatasets(iGPRDatasets);

}

catch (Exception e) { return null; }

iGPRDescription.GPReplicaDatasets = iERDatasets;

iGPRDescription.SingleGeneration(false);

…return iGPRDescription;

}

Define the data to be replicatedCreate a GPReplicaDescription to define the data to be replicated

Page 26: Distributed Geodatabase Development-best Practices

// Set the replica options

IGPReplicaOptions iReplicaOptions = new GPReplicaOptionsClass();

// Set type to 2 way replica

iReplicaOptions.AccessType = esriReplicaAccessType.esriReplicaBothReadWrite;

// Important only for replicas in disconnected environments

iReplicaOptions.IsChildFirstSender = true;

// Copy the data during creation

iReplicaOptions.RegisterReplicaOnly = false;

// Set the replica options

IGPReplicaOptions iReplicaOptions = new GPReplicaOptionsClass();

// Set type to 2 way replica

iReplicaOptions.AccessType = esriReplicaAccessType.esriReplicaBothReadWrite;

// Important only for replicas in disconnected environments

iReplicaOptions.IsChildFirstSender = true;

// Copy the data during creation

iReplicaOptions.RegisterReplicaOnly = false;

Set the replica optionsUse the GPReplicaOptionsClass to define replica options such as the replica type

Page 27: Distributed Geodatabase Development-best Practices

Create the replica

CreateReplicaConnected(iGDSParent, iGDSChild, iRepDescription, iReplicaOptions)

…public void CreateReplicaConnected(IGeoDataServer iGDSParent, IGeoDataServer iGDSChild, IGPReplicaDescription iRepDesc, IGPReplicaOptions iRepOptions)

{

String rVersion = “MyWork”,rName = “MyReplica;

IReplicationAgent iRepAgent = new ReplicationAgentClass();

try {

iRepAgent.CreateReplica(rVersion, iGDSParent, iGDSChild, rName, iRepDesc, iRepOptions);

}

catch (Exception e) {…}

}

CreateReplicaConnected(iGDSParent, iGDSChild, iRepDescription, iReplicaOptions)

…public void CreateReplicaConnected(IGeoDataServer iGDSParent, IGeoDataServer iGDSChild, IGPReplicaDescription iRepDesc, IGPReplicaOptions iRepOptions)

{

String rVersion = “MyWork”,rName = “MyReplica;

IReplicationAgent iRepAgent = new ReplicationAgentClass();

try {

iRepAgent.CreateReplica(rVersion, iGDSParent, iGDSChild, rName, iRepDesc, iRepOptions);

}

catch (Exception e) {…}

}

Create the replica using the ReplicationAgent

See How to create a replica in a connected environment

Page 28: Distributed Geodatabase Development-best Practices

Example: Create Replica in a Disconnected Environment

• Steps Create the replica to a transport file

– initialize geodataserver, create replicadescription, set replica options (as shown in connected)

– Use the GDSExportOptionsClass to define export options such as output format

– Use the GeoDataServer to create the replica to an output file

Transfer the transport file to the targetImport the transport file on the target to complete replica creation

Page 29: Distributed Geodatabase Development-best Practices

Create the replica to a transport file

Create the replica to a transport file from source

CreateReplicaDisconnected(GDSParent, RepDescription, ReplicaOptions)

…public void CreateReplicaDisconnected(IGeoDataServer iGDSParent, IGPReplicaDescription iRepDesc, IGPReplicaOptions iReplicaOptions)

{

String rVersion = “MyWork”,rName = “MyReplica;

esriGDSTransportType trType = esriGDSTransportTypeUrl;

IGDSExportOptions iGDSEOptions = new GDSExportOptions();

iGDSEOptions.ExportFormat = esriGDSExportFormat.esriGDSExportFormatXml;

iGDSEOptions.Compressed = true;

iGDSEOptions.BinaryGeometry = false;

try {

IGDSData iGDSData = iGDSParent.CreateReplica(rVersion, rName, iRepDesc, iReplicaOptions, iGDSEOptions, esriGDSTransportTypeUrl);

}

catch (Exception e) {…}

}

CreateReplicaDisconnected(GDSParent, RepDescription, ReplicaOptions)

…public void CreateReplicaDisconnected(IGeoDataServer iGDSParent, IGPReplicaDescription iRepDesc, IGPReplicaOptions iReplicaOptions)

{

String rVersion = “MyWork”,rName = “MyReplica;

esriGDSTransportType trType = esriGDSTransportTypeUrl;

IGDSExportOptions iGDSEOptions = new GDSExportOptions();

iGDSEOptions.ExportFormat = esriGDSExportFormat.esriGDSExportFormatXml;

iGDSEOptions.Compressed = true;

iGDSEOptions.BinaryGeometry = false;

try {

IGDSData iGDSData = iGDSParent.CreateReplica(rVersion, rName, iRepDesc, iReplicaOptions, iGDSEOptions, esriGDSTransportTypeUrl);

}

catch (Exception e) {…}

}

Page 30: Distributed Geodatabase Development-best Practices

// reference the file to import with the GDSData object

IGDSData iGDSData = new GDSDataClass();

iGDSData.TransportType = esriGDSTransportType.esriGDSTransportTypeURL;

iGDSData.Compressed = true;

iGDSData.URL = @“D:\filestoimport\myreplica.zip";

// Import the replica workspace document to create the replica

iGDSChild.ImportData(iGDSData, esriGDSImportFormat.esriGDSImportFormatXmlWorkspace)

// reference the file to import with the GDSData object

IGDSData iGDSData = new GDSDataClass();

iGDSData.TransportType = esriGDSTransportType.esriGDSTransportTypeURL;

iGDSData.Compressed = true;

iGDSData.URL = @“D:\filestoimport\myreplica.zip";

// Import the replica workspace document to create the replica

iGDSChild.ImportData(iGDSData, esriGDSImportFormat.esriGDSImportFormatXmlWorkspace)

Transport the file and Import

File can transported manually or automatically– Manual example: burn file to CD and send through US Mail– Automated example: use a data distributed service to FTP files

on a regular basis

Importing the transport file on the target– Initialize a GeoDataServer for the target and use ImportData

method

See See How to create a replica in a disconnected environmentHow to create a replica in a disconnected environment

Page 31: Distributed Geodatabase Development-best Practices

Creating Replicas - Best Practices

• Define your replica description for what you want to synchronize- Replica schema synchronization only supports adding simple

feature classes and tables

• Use replica registration option for large dataset replica creation

• Getting related objects is expensive so use this option only when it is necessary

• Use GeoDataServer instead of ReplicationAgent when creating checkout to a new Personal GDB or FileGDB

Page 32: Distributed Geodatabase Development-best Practices

Creating Replicas - Replica Creation Events•• Developers may wish to extend the core replication behaviorDevelopers may wish to extend the core replication behavior

•• The replication creation process can be extended byThe replication creation process can be extended byimplementing a Workspace extension that supportsimplementing a Workspace extension that supportsIWorkspaceReplicaEventsIWorkspaceReplicaEvents

•• See See About Workspace ExtensionsAbout Workspace Extensions

Interface IWorkspaceReplicaEvents : IUnknown

{

HRESLT BeforeCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription* iRDesc,

IWorkspace* childWS);

HRESULT AfterCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription* iRDesc,

IWorkspace* iChildWS);

};

Interface IWorkspaceReplicaEvents : IUnknown

{

HRESLT BeforeCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription* iRDesc,

IWorkspace* childWS);

HRESULT AfterCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription* iRDesc,

IWorkspace* iChildWS);

};

Page 33: Distributed Geodatabase Development-best Practices

WorkspaceExtension With ReplicaEvents

•• WSExtension needs to support IWorkspaceExtensionControl,WSExtension needs to support IWorkspaceExtensionControl,IWorkspaceExtension and IWorkspaceReplicaEvents interfacesIWorkspaceExtension and IWorkspaceReplicaEvents interfaces

•• WSExtension needs to be registered as COM object (regasm.exe,WSExtension needs to be registered as COM object (regasm.exe,regsvr32.exe)regsvr32.exe)

•• WSExtension needs to be registered with the workspaceWSExtension needs to be registered with the workspace

Interface IWorkspaceReplicaEvents : IUnknown

{

HRESLT BeforeCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription rDesc,

IWorkspace* childWS);

HRESULT AfterCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription rDesc,

IWorkspace* childWS);

Interface IWorkspaceReplicaEvents : IUnknown

{

HRESLT BeforeCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription rDesc,

IWorkspace* childWS);

HRESULT AfterCreatingReplicaEvents(BSTR replicaName,

esriReplicaType rType,

IReplicaDescription rDesc,

IWorkspace* childWS);

};

public void RegisterExtension(IWorkspace iWS, String extGUID)

{

IWorkspaceExtensionManager iWSMgr = iWS as IWorkspaceExtensionManager;

UID uid = new UID();

uid.Value = extGUID;

IWorkspaceExtension iWSExt = iWSMgr.FindExtension(uid);

if (iWSExt == null) {

try { iWSMgr.RegisterExtension(uid); }

catch (COMException ce) {…}

}

}

public void RegisterExtension(IWorkspace iWS, String extGUID)

{

IWorkspaceExtensionManager iWSMgr = iWS as IWorkspaceExtensionManager;

UID uid = new UID();

uid.Value = extGUID;

IWorkspaceExtension iWSExt = iWSMgr.FindExtension(uid);

if (iWSExt == null) {

try { iWSMgr.RegisterExtension(uid); }

catch (COMException ce) {…}

}

}

Page 34: Distributed Geodatabase Development-best Practices

Replica Creation Demo

Parent Child

DLL

1. Build workspace extension

2. Register workspace extension 3. Create Replica

After event

Before event

• Build a custom workspace extension to augment replica creation with non-versioned tables using C#

• 9.3 beta web how to article: http://edndoc.esri.com/arcobjects/9.3/NET/2e77fc43-39a1-4685-a7f3-d0122ed7ca10.htm

Page 35: Distributed Geodatabase Development-best Practices

Altering Replica DefinitionReplica description can be changed after creating a replicaReplica description can be changed after creating a replica

public void AlterReplica(IWorkspace iWS, string tableName, string dbase, string owner

) {

IWorkspaceReplicas iWR = iWS new IWorkspaceReplicas;

IReplica iReplica = iWS.get_ReplicaByName(“MyReplica”);IReplicaDescription iRD = iReplica.Description;

int index = iRD.FindTable(tableName);

IReplicaFilterDescriptionEdit iFD = iRD as IReplicaFilterDescriptionEdit;

iFD.put_RowsType(index, esriRowsType.esriRowsTypeAll);

IWorkspaceReplicasAdmin iRAdmin = iWR as IWorkspaceReplicasAdmin;

try {

iRAdmin.AlterReplica(iReplica);

}

catch (COMException ce)

{…}

}

public void AlterReplica(IWorkspace iWS, string tableName, string dbase, string owner

) {

IWorkspaceReplicas iWR = iWS new IWorkspaceReplicas;

IReplica iReplica = iWS.get_ReplicaByName(“MyReplica”);IReplicaDescription iRD = iReplica.Description;

int index = iRD.FindTable(tableName);

IReplicaFilterDescriptionEdit iFD = iRD as IReplicaFilterDescriptionEdit;

iFD.put_RowsType(index, esriRowsType.esriRowsTypeAll);

IWorkspaceReplicasAdmin iRAdmin = iWR as IWorkspaceReplicasAdmin;

try {

iRAdmin.AlterReplica(iReplica);

}

catch (COMException ce)

{…}

}

Page 36: Distributed Geodatabase Development-best Practices

Adding a Dataset to a Replica

• Simple feature classes and tables can be added to a replica once it has been created

• Data must meet replication requirements• Feature class or table must be added to both the parent

and the child replicas• Use the RegisterReplicaDataset method from the

IWorkspaceReplicasAdmin2 interface– This includes the filter and relationship class criteria

Page 37: Distributed Geodatabase Development-best Practices

Synchronizing Replicas

• Replica can be synchronized in connected and disconnected environments

• Synchronize replica changes using ReplicationAgent requires specifying a sync direction (Child->Parent, Parent->Child or Both)

• Use the GeoDataServer to synchronize replica changes from delta Updategram (xml, fileGDB, or Personal GDB)

• Explicit versus implicit acknowledgment during replica synchronization

• Replica synchronization does not allow synchronizing out-of-order messages (e.g., Sync(Gen1)->Sync(Gen2), Sync(Gen4))

Page 38: Distributed Geodatabase Development-best Practices

Example: Synchronize Replicas in a Connected Environment

• Steps Initialize a GeoDataServer for the source and target geodatabasesUse the ReplicationAgent to Synchronize the replica

// Sync the replica

IReplicationAgent iRepAgent = new ReplicationAgentClass();

iRepAgent.SynchronizeReplica(iParentGDS, /* Parent geodataserver */

iChildGDS, /* child geodataserver */

iGPReplicaParent, /* Parent replica */

iGPReplicaChild, /* Child replica */

esriRAResolveConflictsInFavorOfReplica1, /* Reconcile policy */

esriReplicaSynchronizeBoth, /* Sync Direction */

true); /* true = column level conflicts detection */

// Sync the replica

IReplicationAgent iRepAgent = new ReplicationAgentClass();

iRepAgent.SynchronizeReplica(iParentGDS, /* Parent geodataserver */

iChildGDS, /* child geodataserver */

iGPReplicaParent, /* Parent replica */

iGPReplicaChild, /* Child replica */

esriRAResolveConflictsInFavorOfReplica1, /* Reconcile policy */

esriReplicaSynchronizeBoth, /* Sync Direction */

true); /* true = column level conflicts detection */

See See How to synchronize a replica in a connected environmentHow to synchronize a replica in a connected environment

Page 39: Distributed Geodatabase Development-best Practices

Example: Synchronize Replicas in a Disconnected Environment

See See How to synchronize a replica in a disconnected environmentHow to synchronize a replica in a disconnected environment

• Steps Export replica changes to a transport fileTransfer the transport file to the target

• Manual example: burn file to CD and send through US Mail

• Automated example: use a data distributed service to FTP files on a regular basis

Import the transport file on the target to complete replica synchronization

Page 40: Distributed Geodatabase Development-best Practices

Synchronizing Replicas (Exporting Changes)Replica changes can be exported to xml, fileGDB, or personal GDBReplica changes can be exported to xml, fileGDB, or personal GDB

public void ExportReplicaChanges(IGeoDataServer iGDS, String rName)

{

IGDSExportOptions iExOptions = new GDSExportOptions();

iExOptions.ExportFormat = esriGDSExportFormat.esriGDSExportFormatXml

iExOptions.Compressed = true;

iExOptions.BinaryGeometry = true;

esriGDSTransportType tType = esriGDSTransportType.esriGDSTransportTypeUrl;

esriExportGenerationsOption gOption =

esriExportGenerationsOption.esriExportGenerationAll;

IGDSData iGDSData =

iGDS.ExportReplicaChanges(rName, iExOptions, tType, gOption,

false); /* swtich role to be a receiver */

System.Net.WebClient wc = new System.Net.WebClient();

wc.DownLoadFile(iGDSData.URL, @“C:\delta.zip”);wc.Dispose();

}

public void ExportReplicaChanges(IGeoDataServer iGDS, String rName)

{

IGDSExportOptions iExOptions = new GDSExportOptions();

iExOptions.ExportFormat = esriGDSExportFormat.esriGDSExportFormatXml

iExOptions.Compressed = true;

iExOptions.BinaryGeometry = true;

esriGDSTransportType tType = esriGDSTransportType.esriGDSTransportTypeUrl;

esriExportGenerationsOption gOption =

esriExportGenerationsOption.esriExportGenerationAll;

IGDSData iGDSData =

iGDS.ExportReplicaChanges(rName, iExOptions, tType, gOption,

false); /* swtich role to be a receiver */

System.Net.WebClient wc = new System.Net.WebClient();

wc.DownLoadFile(iGDSData.URL, @“C:\delta.zip”);wc.Dispose();

}

Page 41: Distributed Geodatabase Development-best Practices

Synchronizing Replicas (Importing Changes)Replica changes can be imported from xml, fileGDB, or personal GReplica changes can be imported from xml, fileGDB, or personal GDBDB

public void ImportReplicaChanges(IGeoDataServer iGDS, String rName)

{

String fileName = new String(@”C:\delta.zip”);FileInfo fInfo = new FileInfo(fileName); int len = fInfo.Length;

byte [] bytes = new byte[len];

FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read);

BinaryReader r = new BinaryReader(fs);

r.Read(bytes, 0, len);

r.Close(); fs.Close();

IGDSData iGDSData = new GDSDataClass();

iGDSData.TransportType = esriGDSTransportTypeEmbedded;

iGDSData.set_EmbeddedData(ref bytes);

esriReplicaInputSource rSrc = esriGDSReplicaImportSourceDeltaXmlFile;

esriReplicaReconcilePolicyType recPolicy = esriReplicaDetectConflicts;

bool conflicts = iGDS.ImportReplicaChanges(rSrc, recPolicy,

true, /* column conflicts detection */

iGDSData);

}

public void ImportReplicaChanges(IGeoDataServer iGDS, String rName)

{

String fileName = new String(@”C:\delta.zip”);FileInfo fInfo = new FileInfo(fileName); int len = fInfo.Length;

byte [] bytes = new byte[len];

FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read);

BinaryReader r = new BinaryReader(fs);

r.Read(bytes, 0, len);

r.Close(); fs.Close();

IGDSData iGDSData = new GDSDataClass();

iGDSData.TransportType = esriGDSTransportTypeEmbedded;

iGDSData.set_EmbeddedData(ref bytes);

esriReplicaInputSource rSrc = esriGDSReplicaImportSourceDeltaXmlFile;

esriReplicaReconcilePolicyType recPolicy = esriReplicaDetectConflicts;

bool conflicts = iGDS.ImportReplicaChanges(rSrc, recPolicy,

true, /* column conflicts detection */

iGDSData);

}

Page 42: Distributed Geodatabase Development-best Practices

Synchronize Replicas – Replica Sync Events

•• The replication sync process can be extended by implementing aThe replication sync process can be extended by implementing aworkspace extension that supports IWorkspaceSyncReplicaEventsworkspace extension that supports IWorkspaceSyncReplicaEvents

Interface IWorkspaceReplicaSyncEvents : IUnknown

{

…HRESLT BeforeSynchronizingDataChanges(IReplica* iTargetReplica,

IUnknown* iDeltaDataChanges)

HRESULT AfterSynchronizingDataChanges(IReplica* iTargetReplica,

IUnknown* iDeltaDataChanges,

ITable* iOIDMappingTable,

ITable* iChangesTable);

};

Interface IWorkspaceReplicaSyncEvents : IUnknown

{

…HRESLT BeforeSynchronizingDataChanges(IReplica* iTargetReplica,

IUnknown* iDeltaDataChanges)

HRESULT AfterSynchronizingDataChanges(IReplica* iTargetReplica,

IUnknown* iDeltaDataChanges,

ITable* iOIDMappingTable,

ITable* iChangesTable);

};

Page 43: Distributed Geodatabase Development-best Practices

Fine Grained API: Inspecting Replica ChangesDevelopers may need to get the replica changes without exportingDevelopers may need to get the replica changes without exporting themthem

public ArrayList ReadReplicaChanges(IReplica iReplica, IWorkspaceName iName)

{

IReplicaDataChangeInit2 iInit = new ReplicationDataChangesClass();

esriExportGenerationsOption gOption =

esriExportGenerationsOption.esriExportGenerationsNew;

try {

iInit.Init2(iReplica, iName, gOption);

}

catch (COMException e) {…}

IDataChanges iRDC = iInit as IDataChanges;

IEnumModifiedClassInfo iMCInfos = iRDC.GetModifiedClasses();

ArrayList al = new ArrayList();

IModifiedClassInfo iMCI = null ;

while ((iMCI = iMCInfos.Next()) != null)

al.Add(mcInfo.Name);

return al;

}

public ArrayList ReadReplicaChanges(IReplica iReplica, IWorkspaceName iName)

{

IReplicaDataChangeInit2 iInit = new ReplicationDataChangesClass();

esriExportGenerationsOption gOption =

esriExportGenerationsOption.esriExportGenerationsNew;

try {

iInit.Init2(iReplica, iName, gOption);

}

catch (COMException e) {…}

IDataChanges iRDC = iInit as IDataChanges;

IEnumModifiedClassInfo iMCInfos = iRDC.GetModifiedClasses();

ArrayList al = new ArrayList();

IModifiedClassInfo iMCI = null ;

while ((iMCI = iMCInfos.Next()) != null)

al.Add(mcInfo.Name);

return al;

}

Page 44: Distributed Geodatabase Development-best Practices

Synchronization Algorithm Internals

• Inserts maybe applied as updates if already exist

• Updates maybe applied as inserts if not already exist

• Synchronization preserves only GlobalIDs (not OIDs)

• OIDs Mapping table is created for new rows

• To preserve relationships where the origin key is an ObjectID, foreign keys are swizzled for newly allocated ObjectIDs

Page 45: Distributed Geodatabase Development-best Practices

Synchronization Algorithm Internals

• Except for creating topology dirty areas and rebuilding GN connectivity, no behaviors are executed when synchronizing changes

• Validating topology might be needed after replica synchronization

• Sync replica rebuilds geometric network connectivity only for the changes and the area affected by the changes

• Related objects are synchronized based on the relationship directions specified at the replica creation

• Conflict version is created when Rec/Post the changes with the replica version fails

• Overlapping replica generations is accepted (Gen1, Gen1->3)

Page 46: Distributed Geodatabase Development-best Practices

Synchronize Replica - Best Practice

• Use acknowledgment after disconnected synchronization if possible

• Export only new changes if you know that the prior sent changes were received by the target replica

• Synchronize changes as often as possible

• Use delta FileGDB as an updategram unless you need to work with XML

• Use IWorkspace3::get_RecommendedSyncOrder to find out which replicas need to be synchronized before compressing the geodatabase

Page 47: Distributed Geodatabase Development-best Practices

Replica Sync OrderDevelopers may need to sync replicas before compressing the geodDevelopers may need to sync replicas before compressing the geodatabaseatabase

public ArrayList GetRecommendedReplicasSyncOrder(IWorkspace iWS)

{

IVersionedWorkspace3 iVWS = iWS as IVersionedWorkspace3;

IEnumBSTR iRepNames = null;

try {

iRepNames = iVWS.RecommendedSyncOrder;

catch {

return null;

}

IWorkspaceReplicas iWSReplicas = iWS as IWorkspaceReplicas;

ArrayList al = new ArrayList();

string rName;

while ((rName = iRepNames.Next()) != null) {

IReplica iReplica = iWSReplicas.get_ReplicaByName(rName);

al.Add(iReplica);

}

return al;

}

public ArrayList GetRecommendedReplicasSyncOrder(IWorkspace iWS)

{

IVersionedWorkspace3 iVWS = iWS as IVersionedWorkspace3;

IEnumBSTR iRepNames = null;

try {

iRepNames = iVWS.RecommendedSyncOrder;

catch {

return null;

}

IWorkspaceReplicas iWSReplicas = iWS as IWorkspaceReplicas;

ArrayList al = new ArrayList();

string rName;

while ((rName = iRepNames.Next()) != null) {

IReplica iReplica = iWSReplicas.get_ReplicaByName(rName);

al.Add(iReplica);

}

return al;

}

Page 48: Distributed Geodatabase Development-best Practices

Fine Grained API: Version Differences

Developers may need to import version differences to the replicaDevelopers may need to import version differences to the replica versionversion

public void ExportVersionChanges(IWorkspaceName iSRC, IWorkspaceName iTrg)

{

IVersionDataChangesInit iVInit = new VersionDataChangesClass();

try {

iVInit.Init(iSRC, iTrg);

}

catch (COMException e) {…}

IExportDataChanges iEDC = new DataChangesExporter();

esriExportDataChangesOption exOption =

esriExportDataChangesOption.esriExportToXML;

try {

iEDC.ExportChanges(@”C:\VersionDiff.xml”,exOption,

iVInit as IDataChanges,

false); /* overwrite if exists */

}

catch (COMException ce)

{ … }

}

public void ExportVersionChanges(IWorkspaceName iSRC, IWorkspaceName iTrg)

{

IVersionDataChangesInit iVInit = new VersionDataChangesClass();

try {

iVInit.Init(iSRC, iTrg);

}

catch (COMException e) {…}

IExportDataChanges iEDC = new DataChangesExporter();

esriExportDataChangesOption exOption =

esriExportDataChangesOption.esriExportToXML;

try {

iEDC.ExportChanges(@”C:\VersionDiff.xml”,exOption,

iVInit as IDataChanges,

false); /* overwrite if exists */

}

catch (COMException ce)

{ … }

}

Page 49: Distributed Geodatabase Development-best Practices

Fine Grained API: Tables Differences

public void ExportTableChanges(ITable iInserts, ITable iUpdates, IStringArrayiDeletes)

{

ITablesDataChanges iTDCs = new TablesDataChangesClass();

try {

ITableDataChange iTDC = new TableDataChange();

iTDC.Init(“Parcel”, iInserts, iUpdates, null);iTDC.SetDeletedIDs(null, iDeletes);

iTDCs.Add(ipTDC);

}

catch (COMException e) {…}

IExportDataChanges iEDC = new DataChangesExporter();

try {

iEDC.ExportChanges(@”C:\TableDiffs.xml”,esriExportDataChangesOption.esriExportToXML,

iTDCs as IDataChanges,

false); /* overwrite if exists */

}

catch (COMException ce)

{ … }

}

public void ExportTableChanges(ITable iInserts, ITable iUpdates, IStringArrayiDeletes)

{

ITablesDataChanges iTDCs = new TablesDataChangesClass();

try {

ITableDataChange iTDC = new TableDataChange();

iTDC.Init(“Parcel”, iInserts, iUpdates, null);iTDC.SetDeletedIDs(null, iDeletes);

iTDCs.Add(ipTDC);

}

catch (COMException e) {…}

IExportDataChanges iEDC = new DataChangesExporter();

try {

iEDC.ExportChanges(@”C:\TableDiffs.xml”,esriExportDataChangesOption.esriExportToXML,

iTDCs as IDataChanges,

false); /* overwrite if exists */

}

catch (COMException ce)

{ … }

}

Page 50: Distributed Geodatabase Development-best Practices

Fine Grained API: Importing Differences Developers may need to import version/Tables differences to the Developers may need to import version/Tables differences to the replicareplica

public void ImportChanges(IWorkspaceName iReplicaWorkspace)

{

IDeltaDataChangesInit iInit = new DeltaDataChangesClass();

try {

iInit.Init(@”C:\diffs.xml”, esriExportToXML);}

catch (COMException e) {…}

IImportDataChanges2 iImportDC = new DataChangesImporterClass();

try {

bool conflicts = iImportDC.ImportDataChanges2(

iRepWorkspace,

iInit as IDeltaDataChanges,

true, /* reconcile with the parent version */

esriReplicaReconcilePolicyType.esriReplicaDetectConflicts,

true, /* column level conflicts detection */

true); /* create oid mapping table */

}

catch (COMException ce) {…}

}

public void ImportChanges(IWorkspaceName iReplicaWorkspace)

{

IDeltaDataChangesInit iInit = new DeltaDataChangesClass();

try {

iInit.Init(@”C:\diffs.xml”, esriExportToXML);}

catch (COMException e) {…}

IImportDataChanges2 iImportDC = new DataChangesImporterClass();

try {

bool conflicts = iImportDC.ImportDataChanges2(

iRepWorkspace,

iInit as IDeltaDataChanges,

true, /* reconcile with the parent version */

esriReplicaReconcilePolicyType.esriReplicaDetectConflicts,

true, /* column level conflicts detection */

true); /* create oid mapping table */

}

catch (COMException ce) {…}

}

Page 51: Distributed Geodatabase Development-best Practices

Enhancements – User Defined GlobalIDs

• Allows users who already manage their own unique identifiers to start using geodatabase globalid columns

• New interface (IClassSchemaEX) allows you to control the globalid values– Add user defined GUID values to a column of type GUID– Use IClassSchemaEX to convert the GUID column a to GlobalID

column– IClassSchemaEX can also be used to change the type from

GlobalID to GUID such that more changes can be made

• Not supported in a versioned environment

Page 52: Distributed Geodatabase Development-best Practices

Replication Interoperability with non-geodatabase formats

• Replication where the parent is a geodatabase and the child is a non-geodatabase format

• Use the data interoperability extension to build 1 way replication and check-out replication workflows

• To check in it is required to generate an ESRI XML data change file programmatically

– Use ESRI’s published XML schema of the geodatabase

Page 53: Distributed Geodatabase Development-best Practices

1 way replication workflow

Create 1 way replica Parent

GeodatabaseChildChild

GeodatabaseGeodatabase

SynchronizeChanges Parent

GeodatabaseChildChild

GeodatabaseGeodatabase

convert data ((InteropInterop ext)ext)

• Create Replica

• Synchronize Replica

convert data ((InteropInterop ext)ext)

External System

External System

Page 54: Distributed Geodatabase Development-best Practices

Check-out replication workflow

V

V V

Check Out

XMLXML

Generate ESRI XML data change file

programmatically

Check In

Enterprise Enterprise GeodatabaseGeodatabase

XMLXML Workspace docWorkspace doc

GeodatabaseGeodatabase

Data Change File

External SystemConvert Data(Interop extension)

OROR

Page 55: Distributed Geodatabase Development-best Practices

Replication Interoperability with External Systems

• Simple versus full geodatabase replication model

• Check in supports both simple and full geodatabase model

• Check in from external system requires a knowledge of the checkout guid

• Check in synchronization order

Page 56: Distributed Geodatabase Development-best Practices

ESRI Developer Summit 2008ESRI Developer Summit 2008 5656

ESRI XML Data Change File

<esri:UpdateGram xmlns:esri=http://www.esri.com/schemas/ArcGIS/9.2… ><GeodatabaseRelease>…</GeodatabaseRelease><GUID>D6A7E5C3-9EF0-45DE-B412-55502DAEEEC4</GUID><ParentID>70</ParentID> <ParentConnectionInfo>…</ParentConnectionInfo><ModelType>esriModelTypeFullGeodatabase</ModelType> <UpdateGramDefinition>

<ChangedDatasetDefinition><DatasetName>states</DatasetName> <DatasetType>esriDTFeatureClass</DatasetType> <ParentDB /> <ParentOwner>BOB</ParentOwner>

</ChangedDatasetDefinition></UpdateGramDefinition><UpdateGramTopologyDefinition /> <UpdateGramData>…</UpdateGramData>

</esri:Updategram>

Page 57: Distributed Geodatabase Development-best Practices

In ConclusionIn Conclusion……

•• Other recommended sessions and meetingsOther recommended sessions and meetingsTo do

•• All sessions are recorded and will be available on EDNAll sessions are recorded and will be available on EDN–– Slides and code will also be availableSlides and code will also be available

•• Please fill out session surveys!Please fill out session surveys!

•• Still have questions?Still have questions?1.1. Tech talk, Demo Theatres, Meet the TeamTech talk, Demo Theatres, Meet the Team2.2. ““Ask a DeveloperAsk a Developer”” link on web pagelink on web page

•• www.esri.com/devsummit/techquestionswww.esri.com/devsummit/techquestionsESRI Developer Summit 2008ESRI Developer Summit 2008 5757


Top Related