0

我知道这篇文章很长,但它也包含针对我的问题的建议解决方案。因此,问题本身并没有那么长……不要害怕。:)

请帮助我解决以下情况:

我将拥有一个用于存储数据集的 SQL 服务器。我还将有一堆需要与服务器同步的 PC 客户端(都具有自己的本地 SQL 服务器)。PC 将被唯一标识。

例子:

假设我有 2 个 PC 客户端,PC1 和 PC2。

在服务器上,我有以下数据集:

DS1 DS2

在客户端 PC 上,我没有任何东西可以开始。当 PC1 将连接到服务器以查看“是否有任何新内容”时,它会注意到有两个数据集需要检索,因此它将使用 DS1 和 DS2 更新其本地数据库。PC2 也会发生同样的情况。现在,假设 PC2 在本地修改 DS2。当 PC2 连接到服务器时,它将使用它对其本地 DS2 所做的更改来更新服务器上的 DS2。最后,当 PC1 再次连接以查看是否有任何更改时,它会注意到 DS2 已更改,它会检索它并用来自服务器的 DS2 覆盖其本地 DS2。

不必担心并发问题,因为并非所有 PC 都可以更改任何数据集。只有特定数据集的所有者可以更改它(所有者被定义为单个 PC。)

我想到了一些解决方案,但它们似乎效率不高;也许其他人会有一些想法。

第一种解决方案:

在服务器上,我将创建一个名为“SyncTable”的表,我将在其中写入对数据集的任何更改。

例子:

假设 PC1 需要检索 DS1,而 PC2 需要检索 DS4 和 DS5。

同步表将包含:

PC1 DS1
PC2 DS4
PC2 DS5

因此,当 PC2 连接到服务器时,它会查看此表,并指出它需要下载 DS4 和 DS5,然后继续执行此操作,然后从服务器表中删除其两个条目。因此,服务器表将仅在 PC2 自身同步后包含“PC1 DS1”。下一次,当 PC2 连接时,注意到它没有条目,因此知道它是“最新的”。当 PC1 连接时,会发生完全相同的事情:它会注意到它需要下载 DS1,下载它然后删除该条目。

这样做的问题是,如果有 10 000 台 PC,并且可能修改了 5000 个数据集,我将在此表中有很多条目。

第二种解决方案是存储与每个数据集关联的修改时间戳。这样做的问题是客户端 PC 必须检查所有本地记录,并将本地时间戳与服务器上的最后一个时间戳进行比较,以查看是否有任何更改。在给定大量记录的情况下,不确定这有多有效。似乎如果他们能直接知道在哪里查找更改而不是每次都检查所有记录会更好......

因此,您对此有什么建议吗?

使用的技术:客户端 PC 上的 MS SQL Server Compact Edition 3.5 和服务器上的 MySQL。通信将通过网络服务完成。因此,合并复制/远程数据访问已被淘汰。

谢谢!

4

1 回答 1

0

您正在考虑两种选择

  1. 在修改时生成所需更新列表,客户询问“我的更新列表中有什么”?
  2. 保留时间戳,以便客户可以询问“我最近的 DSx 时间是……,我需要更新吗?”

我认为选项 2 是可取的。我认为它对问题、从客户端崩溃中恢复等更具弹性。这是因为每个参与者只保留它所知道的:数据的日期。服务器不需要“了解”谁拿走了什么。

我认为您可以优化确定要上传的内容。你说的好像客户端需要遍历它的所有数据集,一次检索一个时间戳,并做出检索的决定。相反,您可以进行 Web 服务调用:

I have DS1=<time>, DS2=<time> ...; which do I need to download?

实际的决定是由服务器根据客户端发送的数据做出的,而不是客户端获取数据以允许它自己做出决定。

顺便说一句,我应该指出,有商业产品可以处理这一切。你真的需要编码吗?

于 2010-01-13T12:11:51.477 回答