Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Q:Parse.com查询计数稳定性_Java_Android_Parse Platform - Fatal编程技术网

Java Q:Parse.com查询计数稳定性

Java Q:Parse.com查询计数稳定性,java,android,parse-platform,Java,Android,Parse Platform,出于测试目的,我将以下代码放在活动的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

出于测试目的,我将以下代码放在活动的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());
                }
            }
        });
    }

有人能解释一下这种行为以及如何纠正它吗

在不了解更多细节的情况下,我倾向于认为这种不一致性是由于线程和同步/异步调用的混合造成的

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

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

最后,使用Parse进行计数操作

计数查询的速率限制为每次最多160个请求 分钟。它们还可以为具有更多属性的类返回不准确的结果 超过1000件物品。因此,最好是构建您的 用于避免此类计数操作的应用程序(通过使用计数器, 例如。)

来自Héctor Ramos

一旦你抛出一些查询,计数查询总是很昂贵的 中的约束。如果你只关心的总大小的问题 集合中,您可以运行计数查询,而无需任何约束 一个应该是相当快的,因为获得记录的总数是一个简单的过程 与计算其中有多少匹配任意值不同的问题 约束列表。这就是使用数据库的现实 系统

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


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

除了Android boiler plate之外,没有多少其他代码。在循环中运行计数很简单,可以说明计数的行为不稳定/不可靠。在执行多个调用时(即使在填充数据库的情况下)也存在相同的行为。当所有事情都完全同步时,也会发生同样的情况。除此之外,我没有提到会导致任何费率限制的大小。如果只执行一次计数查询,会发生什么?每次都有效吗?如果Parse有适当的预防措施来限制来自同一客户机的计数操作的突然爆发,考虑到计数操作是多么昂贵,我不会感到惊讶。也许是这样的,因为10个中的1个正在工作。如果你还没有看到这个链接,你可能还想查看它。我将用摘录更新答案。
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