Java Q:Parse.com查询计数稳定性
出于测试目的,我将以下代码放在活动的onCreate()中: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
// 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