【问题标题】:Why does zumero_sync need to be called multiple times?为什么zumero_sync需要多次调用?
【发布时间】:2013-07-14 12:13:46
【问题描述】:

根据zumero_sync的文档:

如果需要从服务器拉取大量信息, 此函数可能需要多次调用。

在我使用 Zumero 的 Android 应用中,这没问题;我只是一直调用zumero_sync,直到返回值不是以"0;" 开头。

但是,现在我正在尝试编写一个管理脚本,该脚本也与我的服务器 dbfile 同步。我想使用sqlite3 shell,并让脚本通过命令行参数传递 SQL 来执行。我需要在循环中调用zumero_sync(SQLite 不支持)以确保数据库完全同步。如果必须,我可以在循环中调用sqlite3(读取它的输出,寻找"0;"),或者甚至编写一个C++ 应用程序来本地调用SQLite/Zumero 函数。但是如果一个zumero_sync 就足够了,那肯定会更容易。

我想我真正的问题是:zumero_sync 是否可以更改,以便在返回之前完成同步?如果存在现有行为更有用的情况,也许可以有一个参数来指定使用哪种模式?

【问题讨论】:

    标签: sqlite zumero


    【解决方案1】:

    我在这里看到两个基本问题:

    (1) 为什么zumero_sync() 会这样工作?

    (2) 可以不同的工作方式吗?

    我将首先回答 (2),因为它更容易:是的,它可以以不同的方式工作。相反,我们可以(并且可能很快,你会提出这个)实现一个额外的函数,命名为 zumero_sync_complete(),它在循环中执行 [the guts of] zumero_sync() 并在同步完成后返回。

    我们没有实现 zumero_sync_complete() 因为它没有增加太多价值。这是一个简单的循环,因此您可以自己编写它。 :-)

    呃,不支持循环的脚本环境除外。就像 sqlite3 shell。

    答案(1):

    Zumero 同步协议旨在让服务器能够灵活地返回部分结果(如果它愿意)。为了减少服务器上的负载(并提高其可扩展性),它通常确实想要这样做。

    鉴于此,将其公开给客户的一个原因也是为了增加客户的灵活性。只要我们进行多次往返,我们不妨让客户有机会在它们之间做一些事情(比如,也许,更新进度条)。

    客户端可能想要在循环迭代之间做的另一件事是处理错误。

    或者,在多线程客户端的情况下,它可能想要处理同步进行时客户端上发生的更改。

    这提出了应该如何管理锁定的问题?我们是否在整个循环期间持有 sqlite 写锁?还是仅在绝对必要时?

    底线:一个强大的应用程序可能希望自己实现循环,以便它可以做出自己的决定并保持对事物的完全控制。

    但是,正如您所观察到的,sqlite3 shell 没有循环。它不是一个应用程序。而且它没有线程。或进度条。因此,这是一个使用更简单且功能更弱的 zumero_sync() 形式的用例。

    【讨论】:

    • 谢谢埃里克!顺便说一句,我认为 Zumero 对同步过程提供了如此多的控制,这很棒。
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多