代码之家  ›  专栏  ›  技术社区  ›  Jason

内部简单数据同步

  •  0
  • Jason  · 技术社区  · 16 年前

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

    请帮助我处理以下情况:

    我将有一个SQL服务器,在其中存储数据集。我还将拥有一组PC客户机(都有自己的本地SQL服务器),这些客户机需要与服务器同步。PC将唯一标识。

    例子:

    假设我有两个PC客户机,PC1和PC2。

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

    DS1 DS2

    在客户机上,我将没有任何东西可以开始。当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同步后的“PC1DS1”。下次,当PC2连接时,注意到它没有条目,因此知道它是“最新的”。当PC1连接时,会发生完全相同的事情:它会注意到它需要下载DS1,下载它,然后删除条目。

    问题是,如果有10000台PC,或者修改了5000个数据集,我会在这个表中有很多条目。

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

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

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

    谢谢!

    1 回复  |  直到 16 年前
        1
  •  0
  •   djna    16 年前

    你正在考虑两种选择

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

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

    我认为你可以优化上传内容的决心。您的讲话就像客户机需要遍历所有的数据集一样,一次检索一个时间戳,并决定检索。相反,您可以使用Web服务调用:

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

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

    顺便说一下,我应该指出,有商业产品比处理所有这些。你真的需要编码吗?