同步设置

管理您的数据有效地使用访问 Microsoft 同步 Framework

James Yip

本文讨论:

  • Microsoft 同步框架
  • 同步服务
  • 元数据存储
  • 架构同步
本文涉及以下技术:
ADO.NET,Microsoft Sync Framework,SQL Server

内容

使用情况
隐藏 Microsoft 同步框架
同步提供程序
同步 Framework 中的元数据存储服务
操作中的同步服务
同步数据和架构
实现自定义同步
向上覆盖

就永远不会将普通任务 同步不同的数据存储之间的数据。编写您自己的逻辑进行同步将是一个耗时并且成本的过程。但有与 Microsoft 同步框架和其构成 API,生成同步逻辑变得更加简单。Microsoft 同步 Framework 帮助您从任何网络上使用任何协议的任何数据存储的应用程序数据集成。

结合在 Microsoft 同步 Framework 与 Microsoft 发布了 Microsoft 同步服务为 ADO.NET、 文件系统的同步服务和同步服务 FeedSync,所有这些使开发人员可以为特定环境与 Microsoft 同步框架是用于构建应用程序中的同步逻辑不同执行同步操作。

这些同步服务提供一组工具,帮助您同步两个数据库源之间的数据、 机器,间同步的文件和与 RSS 或 ATOM 源同步您的应用程序。这些服务的借助您可以集中在您的应用程序逻辑上您工作的更多和较少的数据同步。

使用情况

Microsoft 同步 Framework 很有用大量的方案。让我们一下某些常见的。

下载只同步在这种情况下,客户端计算机将不具有确定如何存储以及如何跟踪的存储的数据的权限。示例将 RSS 同步。RSS 提供程序确定如何将信息可用和获取更新频率。客户端确定提供内容和时间。

脱机数据访问通常,需要授予一些 Windows 应用程序脱机数据访问权限,以便应用程序可以继续正常运行,如果用户没有连接到网络。示例是库存应用程序。您可能需要能够在其便携式计算机和与您的数据库的稍后同步输入销售数据在远程销售人员。

对等的数据协作有时会发出数据库提高性能,在客户端上的本地副本。有几个类本地副本周围浮动时, 需要相应地更新您的后端数据存储库,以便所有更改都考虑的。这一典型示例是销售点 (POS) 应用程序。为销售发生,POS 应用程序,每个存储区中的将记录销售交易记录,并更新商店的库存。在集中的数据存储和其他商店正在使用,以便在每个商店的销售人员另一方面知道库存的状态的数据库的所有本地副本中,必须反映这些更新。

这些数据访问方案的 Microsoft 同步 Framework 表示最常见的用途。让我们现在看一下原理来解决这些脱机的数据访问问题。

隐藏 Microsoft 同步框架

Microsoft 同步框架使用一个会话执行数据同步。在的会话中您可以定义从其所做的更改来自数据源和目标复制了更改。同步被触发由客户端时, 将发生以下:

  1. 创建同步会话。
  2. 同步框架检查目标数据,以查看是否存在已提交因为下载本地副本的其他源中的更改。
  3. 找到的任何更改都将将应用它们发送到源。
  4. 目标然后将请求源到目标存储发送它的更改。
  5. 源将发送更改,和在将应用于目标数据存储。

为了为此源和目标需要维护某些元数据,因此它们可以标识的同步之间发生了更改。有许多种方法可以这样做,每种取决于我们同步的数据的类型。

根据应用程序和要实现的同步类型,不需要实现自定义的更改跟踪因为某些数据不包含修订的方法。但某些数据,(如在文件系统中存储的文件已经包含创建和更新元数据。Microsoft 同步框架支持单向同步和双向同步。双向同步实际实现为两个源和目标之间的单向同步。

Microsoft 同步框架使用 SyncOrchestrator 类来管理两个数据源之间的数据流。您不必扩展此类以任何方式,除非您要在同步会话过程中添加自定义应用程序逻辑。

同步的方向由 SyncOrchestrator 类的 Direction 属性控制。您可以选择特定的 SyncOrchestrator 实例是否用于执行的上载或下载或两个同步。

提供程序用于与源和目标数据存储进行通信。您需要告诉的 SyncOrchestrator 触发同步之前,可以使用的提供程序。执行触发该,SyncOrchestrator 将提供程序检索更改,并保存其,解决冲突中调用方法。图 1 显示了同步的工作原理。

fig01.gif

图 1 </a0>-SyncOrchestrator 对象

同步提供程序

Microsoft 同步框架使用提供程序与源和目标的通信。提供程序负责与数据源用于以兼容与关联的数据存储的方式存储应用程序数据通信。它负责还检测根据提供的另一端的同步会话的信息的更改、 应用更改接收,以及用于从数据源中检索的更改。

开发一个提供程序可能需要大量的时间和精力。若要实现同步提供程序,需要实现 KnowledgeSyncProvider 抽象类、 在 IChangeDataRetriever 界面和 INotifyingChangeApplierTarget 接口。这些类和接口中, 有许多的事件可用于实现检测更改并应用其逻辑。

如果没有客户端应用程序和中心数据存储之间的直接连接,您可以实现代理提供程序。代理提供程序接收命令,并在同步会话中中继到其他提供商的这些命令。

代理服务器提供程序可用于方案如客户端应用程序通过 Internet 与中心数据存储进行通信的时。在这种情况下您可能会通过 HTTPS 代理服务器与客户端,然后与 SQL Server 代理服务器。此配置用于减少内部服务器的暴露程度,到 Internet,但是仍然允许外部用户可以使用同步框架来同步数据。

您在相同的方式实现任何提供程序实现代理提供程序。两者之间唯一的区别是由客户端应用程序直接但另一个提供程序将不会触发代理提供程序。

同步 Framework 中的元数据存储服务

某些数据源中不能存储的附加信息或实现任何类型的更改跟踪。一个很好的示例是 Windows 文件系统。在这种情况下,Microsoft 同步框架提供一个解决方案的位置而不是开发人员生成元数据存储库,同步框架提供一个轻量的数据存储区称为元数据存储服务。

存储在元数据存储服务可以创建包含数据、 副本级别数据和项目级别数据的两种的类型。它们用于存储有关一个特定的目标 (副本) 和项的信息。每个目标都需要唯一标识目标的一个副本 ID。

ReplicaMetadata、 ItemMetadata,和 MetadataStore 是表示副本元数据、 项元和元数据存储的抽象类。您可以操作在元数据,这些类的帮助。

SqlMetadataStore 是元数据存储服务,随 Microsoft 同步 Framework,以帮助管理元数据副本级别的开发人员的具体实现。遗憾的是,Microsoft 同步框架不实现项目级别上的元数据的支持。相反,您需要创建自己的实现 ItemMetadata 类的并创建 MetadataStore 对象,如果要存储项目级元数据。SqlMetadataStore 使用 SQL Server 定义的文件中存储元数据。

若要处理 SqlMetadataStore 您,打开保存的存储区使用 OpenStore 方法或者创建使用 CreateStore 方法新建一个。通常,一个存储是足以使应用程序。但如果您愿意您还可以维护多个存储。从存储区检索元数据,您将使用 GetReplicaMetadata 方法。

下面显示如何从一个 SqlMetadataStore 中检索项:

SyncIdFormatGroup idFormat=new SyncIdFormatGroup();
SyncId syncId=new SyncId(1);
SqlMetadataStore metadataStore=SqlMetadataStore.OpenStore(filePath);
ReplicaMetadata item= metadataStore.GetReplicaMetadata(idFormat,syncId);

使用 SqlMetadataStore 时, 需要指定您将存储的数据的架构。 您可以在通过调用在 SqlMetadataStore InitializeReplicaMetadata 方法执行操作。 此方法创建,并填充表基础的 SQL 数据库中保存的信息。 是例如下面的示例显示如何填充有一个字段的元数据存储:

SyncIdFormatGroup idFormat=new SyncIdFormatGroup();
SyncId syncId=new SyncId(1);
FieldSchema[] fields=new FieldSchema[1];
IndexSchema[] indexes=new IndexSchema[1];
fields[0]=new FieldSchema("LastSync",typeof(string));
indexes[0]=new IndexSchema("LastSync",false);
SqlMetadataStore metadataStore=SqlMetadataStore.CreateStore(filePath);
ReplicaMetadata item= metadataStore.InitializeReplicaMetadata(  idFormat,syncId, fields,indexes );

操作中的同步服务

现在,让我们看看如何将同步支持添加到使用同步服务为 ADO.NET 应用程序。 借助 SQL Server 压缩版本 3.5,则可以在本地文件系统来创建轻型的数据存储区。 SQL Server Compact Edition 在好就是它工作方式与 SQL Server 类似,但为该存储库无需修改应用程序使用本地数据存储使用的文件。

同步服务为 ADO.NET 支持数据和架构包括 SQL Server Compact Edition 数据库的 SQL Server 数据库之间的同步。 此处,我将介绍如何启用脱机访问,通过一个 SQL Server Compact Edition 数据库中维护的副本使用中央的 SQL Server 数据库的应用程序。

要实现同步服务为 ADO.NET 时首先是确定如何跟踪数据中的更改。 同步服务为 ADO.NET,您可以利用 SQL Server 2008 集成的更改跟踪,或者通过管理更改跟踪自己在应用数据库中使用自定义跟踪。

SQL Server 2008 中, 启用了集成的更改跟踪的表将登录修订日志表每次数据更改,并同步服务将查看该日志来标识自上次同步以来的所有更改。 这可以防止开发人员不必更改现有的应用程序的数据库架构。

但有时,是使用 SQL Server 2005 应用程序的情况,集成的更改跟踪可能不可用。 在这样的情况下应考虑使用自定义的更改跟踪。 跟踪方法自定义更改标识插入和更新表中的记录的列的帮助,并标识 Tombstone 表的删除。 为了标识已更新或插入自上次更新的行的同步服务需要添加四个列,更新原始发件人、 更新时间、 创建原始发件人,和更新时间,到想要跟踪的每个表。 还需要创建一个名为逻辑删除表格以保留中删除的所有行的日志表。 表中, 您需要至少两个提供条信息: 删除和行的原始主键的时间。

逻辑删除表是在同步服务查找因为它们已经被删除源中必须从目标存储区删除的项。 所有这些信息有助于确定自上次同步以来的更改的同步服务。

同步数据和架构

实现数据库之间同步时, 则保持一致的架构将成为对于大多数应用程序的一个问题。 在这种情况下,同步服务为 ADO.NET 还支持同步数据库架构。 存在但是限制。 同步服务将在开发人员配置以便每次同步时重新创建它,除非执行同步客户端数据库仅第一个时间创建表。

要配置使用同步服务为 ADO.NET 提供程序,您需要实现提供程序配置为在同步表中的代码和要在其中运行同步的方向。 可以从目标源,或同时同步该的目标数据源。 可以将放置代码以提供程序类的构造函数中配置该同步。 以便您可以使具有更多精细控制各个表进行同步,您可以也将分成组表。

与该的目标大多数情况下您不会真正需要显式配置提供程序,因为同步服务为 ADO.NET 将自动创建适当的架构并加载数据。 只需指定目标数据库的位置。 同步服务为 ADO.NET 附带两个提供程序: 一个设计为使用 SQL Server,而其中一个设计用于 SQL Server Compact Edition。 唯一的真正区别与数据库引擎通信时使用的基础库中 ; SQL Server 提供程序使用 System.Data.SqlClient,而提供程序的 SQL Server Compact Edition 使用 System.Data.SqlCeClient。

用于与 SQL Server 通信的提供程序调用 DbServerSyncProvider SqlCeClientSyncProvider 一个适用于 SQL Server Compact Edition 时。 您初始化提供程序时, 需要一个 SyncAdapter 对象,包含有关如何提供程序与通讯在基础的 SQL Server 数据库以及有关更改跟踪详细信息如哪个列是更改原始发件人列和自定义 SQL 更改是否使用跟踪信息。 在 SyncAdapter 中定义的另一个重要部分是信息的同步的方向。 同步服务为 ADO.NET 能够开发人员可以基于每个表定义同步的方向。 同步服务为 ADO.NET 提供与一个 SyncAdapterBuilder,可帮助您通过提供信息如表 name,更新程序列名称创建必需的 SyncAdapter 对象和 SQL 语句创建原始发件人列等等。 图 2 说明了适配器生成器) 如何帮助您创建一个 SyncAdapter。

图 2 SyncAdapterBuilder

sqlSABuilder = new Microsoft.Synchronization.Data.Server.SqlSyncAdapterBuilder(sqlconn);
sqlSABuilder.TableName = "User";
sqlSABuilder.FilterClause = "username='" +   System.Threading.Thread.CurrentPrincipal.Identity.Name + "' ";
sqlSABuilder.TombstoneTableName = "Deleted_"+ sqlSABuilder.TableName;
sqlSABuilder.SyncDirection =   Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
sqlSABuilder.CreationTrackingColumn = "ct";
sqlSABuilder.UpdateTrackingColumn = "ut";
sqlSABuilder.DeletionTrackingColumn = "dt";
sqlSA = sqlSABuilder.ToSyncAdapter(true, true, true, true);
sqlSA.TableName = "User";
destinationProvider.SyncAdapters.Add(sqlSA);

具有称为大部分时间我们只需添加填充 SyncAdapters 源提供程序上的逻辑,。 您需要执行两,如果您正在进行双向同步。

若要设置数据库同步,创建 SyncAgent 对象类似于我前面提到,但为了执行的同步服务为 ADO.NET 同步该 SyncOrchestrator 对象的实例。 然后将提供程序分配给对象的该 RemoteProvider 和 LocalProvider 属性中。 接下来,调用在 SyncAgent 它将触发同步过程并调用相应的事件和提供程序实现的方法的同步方法。 下面说明了如何配置 SyncAgent 和启动同步。

SyncAgent syncAgent=new SyncAgent();
syncAgent.LocalProvider = new SqlCeClientSyncProvider ();
syncAgent.RemoteProvider = new DbServerSyncProvider();
syncAgent.Synchronize();

注意有关同步服务为 ADO.NET 的一个点是就可以将其与支持由 ADO.NET,因此不限于与源和/或目标数据库的 SQL Server 几乎任何数据源。

同步服务为 ADO.NET 使用 SyncTable 对象来存储有关表参与同步的信息。 下面的代码演示如何填充 SyncTable 对象,并使用 SyncAgent 对其进行配置。 可以使用聚合 SyncTables SyncGroup 该类到同步组的 ADO.NET 将作为一个整体处理,并确保组中的所有表的一致性。

SyncGroup lookupSyncGroup=new SyncGroup("LookupTables");
SyncTable syncTable = new SyncTable("Customer");
syncTable.CreationOption = syncTable.DropExistingOrCreateNewTable;
syncTable.SyncDirection = syncTable.Bidirectional;
syncTable.SyncGroup = lookupSyncGroup;
syncAgent.Configuration.SyncTables.Add(syncTable);

实现自定义同步

如果您希望实现使用您自己的逻辑,或者您想实现 Microsoft 同步 Framework 不支持的数据存储进行同步? 在这种情况下,您需要创建自己的提供程序,并实现用于从基础数据存储区检索数据的逻辑。

为此,创建一个从抽象类 KnowledgeSyncProvider 派生类,并重写 GetChangeBatch 方法以检索所做的更改。 启动同步进程时,由 SyncOrchestrator 对象触发此方法。 所有检测到更改存储在一个名为传递给目标提供程序的 ProcessChangeBatch 方法的 ChangeBatch 的对象。 目标提供程序将处理 ChangeBatch 对象,并以应用更改到目标数据存储中使用它自己的逻辑。

FilterInfo 对象用于筛选的信息源和目标提供商之间。 源提供程序负责填充该对象并将其附加到 ChangeBatch 对象。 目标提供程序然后可以使用它将更改应用于只的数据的适当子集。 一旦实现自定义提供程序,可以使用它 SyncOrchestrator。 请记住,但是,同步提供程序不是线程安全,因此您需要在新的线程中使用克隆的提供程序,如果您希望运行不同的线程的多个同步。 为此,创建一个新的提供程序对象,并使用 Union 方法与现有一合并它。 然后配置 SyncOrchestrator 而不是原始使用新创建的提供程序。 否则,同步将失败,如果没有与该提供程序的多个运行同步会话中。

在应用程序中实现同步逻辑时,冲突解决方案始终是有问题。 Microsoft 同步框架将确定该项目,使用下面的逻辑中是否有冲突。

  1. 1.the 目标提供程序确定源副本的知识库中是否包含有项目的目标副本的版本信息。
  2. 2.If 目标副本的版本不包含源副本的知识库,该对象就称为处于冲突。

如果在项目本身未包含目标版本信息,同步框架会触发类实现了 INotifyingChangeApplierTarget 接口,每个项目的 TryGetDestinationVersion 事件。 然后,您可以同步框架来帮助冲突解决方案提供版本控制的信息该事件中添加逻辑。

public bool TryGetDestinationVersion(ItemChange sourceChange, out   ItemChange destinationVersion)
 {
    ...
 }

Microsoft 同步 Framework 在默认情况下支持一些简单的冲突解决方案。 您可以配置提供程序的冲突解析策略,并同步框架将为您执行冲突解决方案。 默认情况下, 同步框架支持以下五种类型的冲突解析策略。

  • 源 wins: 源副本始终获胜如果冲突。
  • 目标 wins: 目标副本始终获胜如果冲突。
  • 合并: 更改源和目标合并以构成该项目然后发送应用于到目标的新版本。
  • 日志: 冲突将被忽略,并冲突的项目信息发送到 SaveConflict 事件的类实现 INotifyingChangeApplierTarget。
  • 推迟: 完全忽略冲突,并且目标存储区不会收到有关冲突的信息。

这些冲突解析策略的所有适用项目级别但仅源 wins,目标 wins 适用于会话。 同步策略由设置 ConflictResolutionPolicy 属性指定提供程序。

destinationProvider.Configuration.ConflictResolutionPolicy =   ConflictResolutionPolicy.DestinationWins;

您可以配置提供程序报告而不是使用默认配置同步的进度。 默认,提供程序将通过调用相关的 SyncCallback 对象的 ProgressChanged 事件报告进度。 可以通过实现您自己的进度报告来更改此行为。 要这样做,您需要执行在使用 WorkEstimate 事件在 ItemChange 类的项目级别或批处理级别使用 ChangeBatch 类的 BatchWorkEstimate 事件的事件。 然后在提供程序代码中,您可以调用提供程序报告更改,只要您认为适合的 OnProgressChanged 方法。

向上覆盖

Microsoft 同步 Framework 是一个应用程序编程框架,用于帮助生成到应用程序的同步。 在 Framework 本身包括了许多功能和简化的生成不同的数据源之间的同步开发工作的库,不真正执行同步: 依赖于开发人员提供逻辑检测并应用更改和解决冲突。

同步服务是一组所要帮助解决将需要一些常用的数据之间的同步存储,如为 SQL Server、 文件系统和 RSS 的库。 与同步服务,不必花费时间开发同步逻辑 ; 您只是需要修改您的应用程序库。 结果是快速,轻松同步。 通过调整 Microsoft 同步 Framework,可轻松地将支持脱机的数据访问和协作到您自己的应用程序。

James Yip MCT、 MCITP、 MCPD PMP,就 Eventus 限制,咨询公司在香港 Kong–based 技术的管理顾问。 James 用作架构师和项目经理。 他还在两个 Windows Server 系统管理和.NET 开发讲解 MOC 类,并作为 SME 和 TR 适合 MOC 课程和作者课件。