gpt4 book ai didi

ios - 同步两个数据库源的算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:05 24 4
gpt4 key购买 nike

我有一个 iOS SQLite 数据库,它是 Postgres 9.3 数据库(主数据库)的镜像。它用于发票应用程序。

此应用程序将有多个正在更新的 SQLite 数据库,最终将与主数据库同步(有时在几个小时后)。主要事件是制作发票,其中有发票抬头 - 发票行 - 付款关系。最近的数据是首选,我不关心冲突解决(因为每个设备都会生成自己的一组发票,两个不同的客户端同时编辑同一条记录是非常罕见的)。

我几乎可以正常工作了,但边缘情况使它难以测试。另外,我怀疑这个问题已经解决了。此外,我希望构建一个测试套件,让我可以测试数百个客户端与数十个主机的对话,并且临时做事不是一个好主意。

这是我现在拥有的:

https://gist.github.com/mamcx/8958295

我的代码是这样做的:

  1. 创建 GUID 和一个版本字段 (autoinc, int) 来记录表的最后一个版本。每次更改都会增加版本。删除都是合乎逻辑的。这在两个数据库中:

    插入“文档”( “版本”, “改变日期”, “已删除”, “编号”,

    ) 值 ( 129、 '2014-02-11 16:16:49.775791-05', '0', '0771bc29-ac5e-49a1-b5d7-3e4f7dccd03a',

    );

  2. 在客户端中保存每个表的版本。请求客户端版本的表,服务器返回记录>版本,然后合并到本地DB。

  3. 更改在客户端完成。将记录连同为服务器中的每一行记录的最新版本一起发送到服务器。更新记录并返回每个记录的版本。

但是,有时我在服务器中获得的行数比在客户端中多,或者当两个不同的设备在过程结束时交换数据时,数据并不相同。该过程在后台进行,无需用户干预。

最佳答案

我怀疑你有时会因为 server.py 中的这一行而得到太多行

sql = table.select().where(table.c.version >= version)

如果在您检索版本号和此查询完成执行之间更新了一个表,那么您可能会得到该表的两个或更多版本 - 您可以尝试在查询完成后过滤掉重复项,或者您可以按版本号按递增顺序对数据进行排序,以便在较早版本之后迭代较新版本 - 您将多次同步某些表,但您将在任何较早版本之后同步最新版本,因此这应该不会有问题。

数据不相同的问题可能只是因为您的同步不是原子的 - 源在同步期间正在更新,因此当同步完成时,它们的数据可能比目标更新。这也可能是早期在 server.py 的第 31 行返回多个版本的表的问题的副作用 - 您可能会用早期版本覆盖表的更高版本,您可以通过过滤或排序查询来防止这种情况发生结果。

记录从源同步的数据(或仅表 ID 和版本),如果您有一个表的多个版本,则过滤掉除最新版本以外的所有版本 - 如果此数据不匹配,则在同步后目标中的数据然后你就会知道出了点问题。

关于ios - 同步两个数据库源的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com