我正在尝试构建一个简单的应用引擎数据存储区实体,它基本上可以计算查看的次数。我已经在JSP文件中设置了代码,它确实增加了变量,但是每次它似乎增加2而不是1。这是有问题的代码。
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity story = datastore.get(KeyFactory.stringToKey(request.getParameter("story_key")));
String json_out = "";
int num_views = 0;
if(story.getProperty("views") != null) {
num_views = Integer.parseInt(story.getProperty("views").toString());
}
//Update the donated status of this object.
story.setProperty("views", num_views + 1);
datastore.put(story);
json_out += "{";
json_out += "\"title\":\"" + story.getProperty("title") + "\", ";
json_out += "\"views\":\"" + num_views + "\"";
json_out += "}";
out.println(json_out);
知道它为什么会增加2?我甚至尝试在获得视图数量时减去一个,但是这个数字一直保持不变,就像你期望的那样。真奇怪。
答案 0 :(得分:4)
如果您正在使用数据存储区实现计数器,那么您应该采用允许高吞吐量的技术。上面的解决方案可能会轻易地每秒写入数据存储区几次,违反了HRD策略。此外,它不是线程安全的(不在事务中运行,因此更新可能无序应用,并且您的结果不是您所期望的)。尝试解决这些问题的分片计数器:
http://code.google.com/appengine/articles/sharding_counters.html