0

我们目前正在使用 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)以及清理后要验证哪些表的任何提示?

提前致谢。

问候,桑达尔。

4

1 回答 1

0
  • 不要使用 SqlCeEngines Cleanup、Repair 或 Compact。它会弄乱你的数据库和你的数据库性能。
  • 仅在目标操作系统上打开或生成数据库。如果您打开在 Windows 10 上生成的 Windows CE 上的数据库(我们在这里有不同的代码页),则需要将其转换为目标平台,这需要花费大量时间。Windows CE 和 Windows XP 是唯一可以保存打开生成数据库的平台。
  • 考虑切换到 SQLite 以避免所有这些废话。
于 2016-08-11T20:15:48.770 回答