繁体   English   中英

问:Parse.com查询计数稳定性

[英]Q: Parse.com query count stability

出于测试目的,我将以下代码放在Activity的onCreate()中:

    // Create 50 objects
    for (int i = 0; i < 50; i++) {
        ParseObject obj = new ParseObject("test_obj");
        obj.put("foo", "bar");
        try {
            obj.save();
        } catch (ParseException pe) {
            Log.d("Parsetest", "Failed to save " + pe.toString());
        }
    }

    // Count them
    for (int i = 0; i < 10; i ++) {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("test_obj");
        query.countInBackground(new CountCallback() {
            @Override
            public void done(int count, ParseException e) {
                if (e == null) {
                    Log.d("Parsetest", "Background found " + count + " objects");
                } else {
                    Log.d("Parsetest", "Query issue" + e.toString());
                }
            }
        });
    }

我希望计数总是五十,但运行此代码产生类似于:

D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 50 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects
D/Parsetest(17761): Background found 0 objects

有人可以解释这种行为以及如何纠正这个问题?

在不知道更多细节的情况下,我倾向于认为不一致是由于线程和同步/异步调用的混合。

例如,调用obj.save(); 同步引用 ),但是,在没有看到其余代码的情况下,可能在后台线程上执行同步保存。

另外, query.countInBackground异步的,并且使用for循环多次调用。 这将同时创建10个单独的后台进程来查询Parse以查找对象的数量,并且根据如何处理保存,可能存在竞争条件。

最后,对Parse的计数操作存在记录限制

计数查询的速率限制为每分钟最多160个请求。 它们还可以为具有1,000个以上对象的类返回不准确的结果。 因此,最好构建应用程序以避免这种计数操作(例如,通过使用计数器)。

来自Parse Developers Google小组的HéctorRamos

一旦你抛出一些约束,计数查询总是很昂贵。如果你只关心集合的总大小,你可以运行一个没有任何约束的计数查询,并且一个应该非常快,因为得到记录的总数是一个不同的问题,而不是计算其中有多少匹配任意约束列表。 这只是使用数据库系统的现实。

考虑到计数操作的成本,Parse可能具有防止来自给定客户端的计数操作的快速突发的机制。

如果您需要经常执行计数操作,建议的方法是使用云代码afterSave挂钩根据需要递增/递减计数器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM