0

我有一个 .NET 应用程序,它使用 Microsoft 同步框架在 SQL Server 2008 R2 服务器和许多 SQL Server CE 客户端之间同步数据。

初始同步成功下载了服务器上的数据,但是同步日志表明它随后会上传刚刚完成下载的未更改数据。这大大延长了初始同步时间。

从下面的 SQL CE 日志中提取(这是其中一个表的初始同步):

***** Client Provider Commit Transaction ****
Connecting to database: Data\Database.sdf
**** Client Provider Begin Transaction ****
----- Client Applying Changes from Server for Group "Staff" -----
----- Applying Deletes for Table Staff-----
Deletes Applied: 0
--- End Applying Deletes for Table Staff-----
----- Applying Upserts for Table Staff-----
----- Applying Inserts for Table Staff-----
Inserts Applied: 1
----- Applying Updates for Table Staff-----
Updates Applied: 0
--- End Applying Upserts for Table Staff---
Staff: Set ReceivedAnchor value: 1832
--- End Client Applying Changes from Server for Group "Staff" ---

这是更改被错误地上传回服务器时的日志,即当没有任何更改时标记为正在更新。

SELECT ut.* FROM    (select ut0.* from [Staff] as ut0 where      (ut0.__sysTrackingContext <>
@CNTX OR ut0.__sysTrackingContext IS NULL)      AND ut0.__sysChangeTxBsn >= @LBSN    ) as ut  
LEFT OUTER JOIN   (select txcs0.* from __sysTxCommitSequence as txcs0) as txcsInsert  ON 
ut.__sysInsertTxBsn = txcsInsert.__sysTxBsn  LEFT OUTER JOIN   (select txcs0.* from     
__sysTxCommitSequence as txcs0) as txcsUpdate  ON ut.__sysChangeTxBsn = txcsUpdate.__sysTxBsn 
WHERE    COALESCE(txcsUpdate.__sysTxCsn, ut.__sysChangeTxBsn) > @LCSN AND COALESCE    
(txcsUpdate.__sysTxCsn, ut.__sysChangeTxBsn) <= @ECSN   AND   (COALESCE(txcsInsert.__sysTxCsn, 
ut.__sysInsertTxBsn) <= @LCSN OR    COALESCE(txcsInsert.__sysTxCsn, ut.__sysInsertTxBsn) IS NULL 
OR    ut.__sysInsertTxBsn IN (SELECT SyncBsn FROM __syncTransactions))
Parameter: @LCSN Value: 0
Parameter: @LBSN Value: 0
Parameter: @ECSN Value: 408
Parameter: @CNTX Value: 73c9795b-29e5-49c3-8a66-f99f667225d5
Update for row with PK: StaffId = 1 

在服务器端,跟踪当前版本在初始同步期间很好,然后在某些时候增加,我假设这是由于客户端认为下载的记录是新的。

可能导致此问题的一件事是禁用跟踪以设置 SyncScope,然后启用。这是在初始同步之后完成的。

不确定我是否提供了足够有用的信息。乐于提供更多。

任何帮助,将不胜感激。谢谢。

4

2 回答 2

0

您如何进行初始同步?如果您在不使用 Sync Framework 或禁用 Tracking 的情况下执行此操作,则 Sync Framework 不知道最初同步的内容。

于 2012-09-22T03:07:03.880 回答
0

解决了这个问题(至少有一个可行(不理想)的解决方案)。这是一个有趣的设计。同步涉及三个单元。服务器、中央同步设备和边缘设备。同步发生如下:

  1. 中央设备执行与服务器的双向同步
  2. 边缘设备执行与中央设备的双向同步。

服务器有 2008 R2,中央和边缘设备运行 SQL CE。

中央同步和边缘设备从服务器获取它们的初始数据,但是当时它们不知道它们会是什么。当应用程序启动时,他们的角色就确定了。因为我们必须在中央和边缘设备上禁用和重新启用跟踪以允许 CE 到 CE 同步(找不到任何其他方法来完成这项工作,因为它在我的评论中抛出了上面的异常),它似乎与CE 到 SQL 2008 同步出现了上述问题,即最初同步的数据被重新传输到服务器。这可以通过手动设置发送的锚点来解决,但是 CE 到 CE 数据库的副作用是将初始数据相互传输,然后再将其传输回服务器。

同步框架在尝试更新和插入行时确实将其视为冲突,但是尽管尝试通过多种方式设置冲突解决规则,但它并没有解决问题。然后,我们尝试在配置数据库之前擦除边缘设备中的数据,以便它可以从中央设备获取最新数据。这解决了这个问题。如前所述,这并不理想,但它是一个可行的解决方案。

如果您对如何在无需擦除边缘设备的情况下解决此问题有任何想法,我们将不胜感激,因为在无需重新加载初始设置期间最初下载的所有数据的情况下进行边缘设备同步设置将是有益的。

干杯。

于 2012-09-24T09:25:47.513 回答