1

今天我终于设法运行客户端(Windows移动设备) - wcf - sql server 2008同步(经过很多问题,主要是MS部分)

我做了测试。对于 24 000 条记录,快照的平均时间大约需要 1 分 20 秒。这是我下载 Microsoft Sync for ADO.NET 修复程序之后的时间。

我还发现,50 秒后,数据库文件终于开始增长,大约需要 25 秒。

框架在前 50 秒内做什么?加载和序列化数据?

在某些页面上,我找到了关于代理序列化的文章,它可以减少传输的数据量。

您知道同步过程是否会从中受益吗?(我的意思是在修补程序后用于 Ado.net 的 MS Sync?)

我能做些什么来加快这个过程吗?在我看来 24000 的 1:24 是两倍多...

4

3 回答 3

1

设备的同步框架有两个主要问题:

  1. 它通过 ADO.NET 数据集交换数据
  2. 在客户端设置客户端数据库以支持“初始”同步时需要大量开销。
  3. SQL CE 在插入时非常慢。

您提到的热修复尽可能地解决了#3,因此您无能为力。

数字 2 是同步框架的一部分,恐怕没有什么可做的。

至于 #1,这就是 50 秒中的大部分时间(可能是 30 秒左右?)被使用的地方:当客户端收到数据集时,它必须在之前反序列化整个流(其中流由极其冗长的 XML 组成)可以开始处理。对于大型数据集(超过 10,000 行),这可能需要很长时间,并且一旦可用堆内存被最大化,甚至可能(并且最终)会导致 Memory Crunch 场景。

您引用的序列化代理方法将大大减少正在交换的响应流的大小(在我的测试中,在某些情况下它几乎小了 90%)。这肯定会在一定程度上缩短响应时间,尤其是在网络连接吞吐量有限的情况下。但是,在一天结束时,您无法绕过这样一个事实,即必须先将流反序列化为 DataSet,然后才能开始客户端处理。

总而言之:是的,代理序列化方法将减少正在传输的数据量,并且您可能会实现一些改进,但多少将取决于以下因素:

  • 数据集的大小
  • 可用设备内存量
  • 设备处理器速度和可用性

希望这可以帮助!

于 2012-09-13T17:06:10.580 回答
1

同步时会发生三件事:1. 它需要枚举已发生的更改

  1. 它需要将其发送到目的地

  2. 它需要应用它

对于枚举,数据库的大小会有很大的影响。即使没有更改,您也会为此检查带来一些性能损失。

请参阅:用于设备的 ADO .NET 的同步服务:通过跳过不需要同步的表来提高性能

对于项目 #2,数据集序列化是瓶颈。您可能会选择使用数据集代理甚至压缩,但是您会在执行代理和压缩时受到打击,您可能看不到巨大的性能改进。

请参阅:同步框架基于 WCF 的离线场景同步 - 使用自定义数据集序列化

对于第 1 项和第 2 项,您可以应用与数据库相同的性能调整,例如通过过滤、调整索引等仅同步您需要的行...

毕竟,Sync Fx 应用程序就像任何其他数据库应用程序一样。

于 2012-09-14T01:41:40.070 回答
0

如果您使用的是 SyncFx 2.1 库(SynchOrchestrator 不是 SyncAgent),那么 SyncFx 将已经在使用 DataSet Surrogate 序列化 - 它是内置的。

为避免与 DataSet 相关的内存不足问题,您可以查看批处理以找到限制每次同步可以发送的记录数的方法。这可以在某种程度上使用任一 SyncFx 库来完成,但 2.1 库比 1.0 库更具确定性*。

*确定性:2.1 库允许您指定最大字节数,SyncFx 将在适合该限制的最后一个完整行自动切断内容。我相信,对于 1.0 库,进行批处理的唯一方法是指定最大行数,并希望(或仔细计算)数据不会超过您想要达到的限制。

于 2012-09-13T18:56:26.960 回答