我理解分片计数器,这里:http://code.google.com/appengine/articles/sharding_counters.html问题是一个简单的计数器在我的应用程序中不起作用。我正在通过一个特定的变量对我的实体进行排序,所以我得到的不是计数,而是更多的排名。我目前的方法是:
SELECT COUNT(this) FROM Entity.class WHERE value <= ?
结果+ 1是持久性Entity对象中与值变量相关的参数的等级。这个限制是返回的最高等级是1001,因为count()最多可以给出1000。 我无法在实体对象上存储排名的原因是排名经常更新,重新设置此排名变量的成本太高。
关于实现这一目标的最佳方法的任何想法?
答案 0 :(得分:1)
您可能需要考虑将类似google-appengine-ranklist项目的内容调整为Java。它构建了一个'ranker'节点树,这样第n个排序项就可以在O(log n)时间内找到,更新同样是O(log n)。
答案 1 :(得分:0)
我会创建一个带有静态变量的类来保存当前计数值。例如,您可以创建以下内容:
public class Counter {
private static int counter = -1;
public static synchronized int getNextValue() {
if (counter == -1) {
counter = // Insert code that retrieves the highest value from Google datastore
}
counter++;
return counter;
}
}