App Engine数据存储区 - 将属性增量递增2

时间:2011-10-11 01:12:30

标签: java google-app-engine google-cloud-datastore

我正在尝试构建一个简单的应用引擎数据存储区实体,它基本上可以计算查看的次数。我已经在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?我甚至尝试在获得视图数量时减去一个,但是这个数字一直保持不变,就像你期望的那样。真奇怪。

1 个答案:

答案 0 :(得分:4)

如果您正在使用数据存储区实现计数器,那么您应该采用允许高吞吐量的技术。上面的解决方案可能会轻易地每秒写入数据存储区几次,违反了HRD策略。此外,它不是线程安全的(不在事务中运行,因此更新可能无序应用,并且您的结果不是您所期望的)。尝试解决这些问题的分片计数器:

http://code.google.com/appengine/articles/sharding_counters.html