5

根据以下文档zumero_sync

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

在我使用 Zumero 的 Android 应用程序中,这没问题;我只是继续调用zumero_sync,直到返回值不以"0;".

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

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

4

1 回答 1

4

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

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

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

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

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

呃,除了不支持循环的脚本环境。就像 sqlite3 外壳一样。

对(1)的回答:

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

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

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

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

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

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

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

于 2013-07-14T14:58:15.013 回答