2013-07-14 38 views
5

Theo tài liệu cho zumero_sync:Tại sao zumero_sync cần được gọi nhiều lần?

Nếu một lượng lớn thông tin cần phải được kéo từ máy chủ, chức năng này có thể cần phải được gọi là nhiều hơn một lần.

Trong ứng dụng Android của tôi sử dụng Zumero thì không có vấn đề gì; Tôi chỉ tiếp tục gọi số zumero_sync cho đến khi giá trị trả lại không bắt đầu bằng "0;".

Tuy nhiên, bây giờ tôi đang cố gắng viết một tập lệnh quản trị cũng đồng bộ hóa với máy chủ dbfiles của tôi. Tôi muốn sử dụng vỏ sqlite3, và có kịch bản vượt qua SQL để thực thi thông qua các đối số dòng lệnh. Tôi cần gọi zumero_sync trong một vòng lặp (mà SQLite không hỗ trợ) để đảm bảo rằng db được đồng bộ hóa hoàn toàn. Nếu tôi phải, tôi có thể gọi sqlite3 trong một vòng lặp (đọc đầu ra của nó, tìm kiếm "0;"), hoặc thậm chí viết một ứng dụng C++ để gọi các hàm SQLite/Zumero nguyên bản. Nhưng nó chắc chắn sẽ dễ dàng hơn nếu một đơn zumero_sync là đủ.

Tôi đoán câu hỏi thực sự của tôi là: có thể zumero_sync được thay đổi để hoàn tất quá trình đồng bộ hóa trước khi trở về không? Nếu có những trường hợp hành vi hiện tại hữu ích hơn, có thể có một tham số để chỉ định chế độ nào sẽ sử dụng?

Trả lời

4

Tôi thấy hai câu hỏi cơ bản ở đây:

(1) Tại sao zumero_sync() hoạt động theo cách đó?

(2) Nó có hoạt động khác không?

Tôi sẽ trả lời (2) trước tiên, vì nó dễ dàng hơn: Có, nó có thể hoạt động khác nhau. Thay vào đó, chúng tôi có thể (và có thể sẽ sớm đưa bạn lên) thực hiện một hàm bổ sung, đặt tên là zumero_sync_complete(), thực hiện [ruột của] zumero_sync() trong một vòng lặp và trả về sau khi quá trình đồng bộ hoàn tất.

Chúng tôi đã không triển khai zumero_sync_complete() vì nó không thêm nhiều giá trị. Đó là một vòng lặp đơn giản, vì vậy bạn có thể darn cũng viết nó cho mình. :-)

Er, ngoại trừ trong môi trường tập lệnh không hỗ trợ vòng lặp. Giống như shell sqlite3.

trả lời (1):

Giao thức đồng bộ Zumero được thiết kế để cung cấp cho các máy chủ sự linh hoạt để trả về kết quả từng phần nếu muốn làm như vậy. Và vì lợi ích của việc giảm tải trên máy chủ (và tăng khả năng mở rộng của nó) nó thường không muốn làm chính xác điều đó.

Cho rằng, một lý do để lộ điều này cho khách hàng là tăng tính linh hoạt của khách hàng. Khi chúng tôi đang thực hiện nhiều vòng, chúng tôi cũng có thể cung cấp cho khách hàng một cơ hội để làm điều gì đó (như, có thể, cập nhật thanh tiến trình) ở giữa chúng.

Một điều khác mà khách hàng có thể muốn thực hiện giữa các lần lặp lặp lại là xử lý lỗi.

Hoặc, trong trường hợp máy khách đa luồng, nó có thể muốn xử lý các thay đổi đã xảy ra trên máy khách trong khi đồng bộ hóa đang diễn ra.

Điều gì đặt ra câu hỏi về cách khóa nên được quản lý?Chúng ta có giữ khóa viết sqlite trong toàn bộ vòng lặp không? Hoặc chỉ khi thật cần thiết?

Tóm lại: Một ứng dụng mạnh mẽ có thể sẽ muốn triển khai chính vòng lặp sao cho nó có thể đưa ra quyết định riêng và giữ toàn quyền kiểm soát mọi thứ.

Nhưng, như bạn quan sát, trình bao sqlite3 không có vòng lặp. Và nó không phải là một ứng dụng. Và nó không có chủ đề. Hoặc thanh tiến trình. Vì vậy, đó là một trường hợp sử dụng mà một hình thức đơn giản và ít mạnh mẽ của zumero_sync() sẽ có ý nghĩa.

+0

Cảm ơn Eric! BTW, tôi nghĩ thật tuyệt khi Zumero cung cấp rất nhiều quyền kiểm soát quá trình đồng bộ hóa. –

Các vấn đề liên quan