为啥要在同步框架中进行对象跟踪?

Posted

技术标签:

【中文标题】为啥要在同步框架中进行对象跟踪?【英文标题】:Why object Tracking in synchronisation framework?为什么要在同步框架中进行对象跟踪? 【发布时间】:2013-09-19 19:12:31 【问题描述】:

我正在使用同步框架来同步两个数据库。创建同步设计器文件的标准过程是,使用数据源配置向导选择表。我创建了 .sync 文件和 SDF 文件。但是,当我与目标数据库同步时,以下代码会发生异常:

var syncDataServerSyncProvider =
new SyncDataServerSyncProvider(
ConfigurationManager.ConnectionStrings["ConnectionString"].
            ConnectionString);
var syncAgent = new SyncDataSyncAgent();
syncAgent.LocalProvider = syncDataClientSyncProvider;
syncAgent.RemoteProvider = syncDataServerSyncProvider;

syncDataClientSyncProvider.SyncProgress += new    EventHandler<SyncProgressEventArgs>(ShowClientProgress);
syncDataClientSyncProvider.ApplyChangeFailed += new EventHandler<ApplyChangeFailedEventArgs>(ShowFailures);

SyncStatistics syncStats = syncAgent.Synchronize();//Exception happen here

例外是:

System.Data.SqlClient.SqlException :无法初始化客户端 数据库,因为表“表名”的架构不能 由 DbServerSyncProvider 的 GetSchema() 方法检索

内部例外是:

未对表“表名”启用更改跟踪

可以通过使用数据源配置向导从目标数据库中选择一个表到同步设计器来解决此异常。我们可以在此向导中启用更改跟踪。但实际上,在部署场景中,我们不能使用设计器文件,因为我们不能使用 Visual Studio。

所以我的问题是

    为什么必须启用此对象跟踪? 我们如何在 C# 代码中启用此对象跟踪而不依赖于 设计师?

【问题讨论】:

【参考方案1】:

为了执行同步,MSF 需要跟踪数据库中的更改(更新/删除/插入)。在不知道这些变化的情况下,同步是不可能的

请注意,更改跟踪可以耦合解耦

耦合更改跟踪意味着更改跟踪元数据用于 插入和更新存储在基表中,带有墓碑 表来跟踪删除。解耦的变更跟踪意味着元数据 用于插入、更新和删除的存储在单独的表中 (通常每个基表一个表)

对于任何一种更改跟踪,您指定的命令 DbSyncAdapter 对象使用更改跟踪元数据来确定 在每个对等方所做的增量更改。

在这里,您使用的是 SQL Server 中包含的耦合更改跟踪选项(自 SQL Server 2008 起可用)。所以正如您所说,您必须在数据库中启用更改跟踪:

首先在数据库级别 然后在表级别(对于所有需要同步的表)

这可以通过 SQL Server Management Studio(数据库属性 > 更改跟踪或表属性 > 更改跟踪)或脚本来完成:

对于数据库:

ALTER DATABASE [DatabaseName] SET CHANGE_TRACKING = ON 

对于表:

ALTER TABLE [TableName] ENABLE CHANGE_TRACKING 

您需要根据需要自定义的重要一点是这些更改的保留期(默认为 2 天):

更改保留值指定更改的时间段 跟踪信息被保留。更改跟踪信息是 超过此时间段的会定期删除。当你在 设置这个值,你应该考虑应用程序多久 与数据库中的表同步。指定的保留 时间段必须至少与之间的最大时间段一样长 同步。如果应用程序在更长的时间内获得更改 间隔,返回的结果可能不正确,因为 一些更改信息可能已被删除。

带有自定义周期并禁用自动清理的示例查询:

ALTER DATABASE [TableName] 
  SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 90 MINUTES, AUTO_CLEANUP = OFF)

以及来自 Sql Server 文档Enable and Disable Change Tracking (SQL Server)的有用链接

【讨论】:

谢谢。我已经通过下面的回答解决了这个问题。但是你的回答很详细。【参考方案2】:

问题现已解决。我已通过运行以下查询在 SQL Server 中启用对象跟踪

Alter database 'DATABASENAME'
set CHANGE_TRACKING =ON

go

ALTER TABLE 'TableName'
ENABLE CHANGE_TRACKING

但是我的第一个问题仍然存在。为什么这个对象跟踪对于同步框架很重要?

【讨论】:

它必须跟踪已更改的内容,否则它将如何查找修改后的数据。

以上是关于为啥要在同步框架中进行对象跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

unity, 同步物体坐标一定要在LateUpdate中进行

为啥在 lock 语句中必须指定同步对象

SQLServerCE / 本地数据缓存 / 同步框架 - 插入错误

为什么wait和notify方法要在同步块中调用?

要同步哪些对象?为啥局部变量不好? [复制]

为啥使用 HttpClient 而不是 HttpWebRequest 进行同步请求