我们目前正在使用 SQL Server CE 3.5 和许多不同的双向同步数据库(Syncframework 2.1)和服务器数据库,以及基于 .net 3.5 Windows 的 WPF 应用程序。但是随着应用程序的性能下降,我们经常需要为用户重新生成新的本地 SDF。通过这种方式,我们看到性能有了明显的改善,并且在 60 天左右之后,同样的情况也会发生。
当我们在配置中启用跟踪时,我们注意到跟踪文件中不断记录以下异常。在我们的代码中,我们只看到方法调用“SetTableSentAnchor”,随后如何调用其他方法?我们如何处理这个异常。
__sysTxCommitSequence:System.InvalidOperationException:保留清理序列无效。对于指定的输入范围,在清理事务表历史之前清理墓碑表。
在 System.Data.SqlServerCe.SqlCeChangeTracking.ProcessResults(Int32 hr)
在 System.Data.SqlServerCe.SqlCeChangeTracking.CheckIfDataIsPresentInTombstone(Int64 retentionValue, PurgeType pType)
在 System.Data.SqlServerCe.SqlCeChangeTracking.PurgeTransactionSequenceData(PurgeType pType, Int64 retentionValue)
在 Microsoft .Synchronization.Data.SqlServerCe.SqlCeClientSyncProvider.SetTableSentAnchor(字符串表名,SyncAnchor 锚点)
此外,我们看到 RetentionInDays 设置为 60,如下所示。这有什么影响吗?
[ConfigurationProperty("clientRetentionInDays", DefaultValue = 60, IsRequired = false)]**
目前代码中没有清除方法。所以我们尝试使用类的PurgeTombstoneTableData
方法SqlCeChangeTracking
来清理Tombstonetable
系统表(_sysOCSDeletedRows
)中的数据。但是我们没有成功,因为我们得到了例外
不允许对系统表进行更改跟踪操作。[表名 = __sysOCSDeletedRows ]
除了上述之外,我们还尝试SqlSyncStoreMetadataCleanup.PerformCleanup
了类似于下面代码片段的方法。但是我们仍然收到错误系统表上不允许更改跟踪操作。
https://msdn.microsoft.com/en-us/library/ee617373(v=SQL.110).aspx
SqlSyncStoreMetadataCleanup metadataCleanup = new SqlSyncStoreMetadataCleanup(serverConn);
bool cleanupSuccessful;
metadataCleanup.RetentionInDays = 7;
cleanupSuccessful = metadataCleanup.PerformCleanup();
问题:
我们如何在清理 Tombstonetable 条目时处理这个异常?
Tombstonetable 存储的其他表是什么?
再生 60 天后,我们如何克服 SDF 的性能问题?
可以遵循哪些其他最佳实践?
关于如何成功清理元数据(PerformCleanup)以及清理后要验证哪些表的任何提示?
提前致谢。
问候,桑达尔。