2011-10-11 41 views
1

我正在尝试构建一个简单的应用程序引擎数据存储区实体,该实体基本上保留了查看次数。我已经在一个JSP文件中设置了代码,它可以增加变量,但每次看起来增加2个而不是1个。这里是有问题的代码。App引擎数据存储区 - 将属性增量递增2

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

如果你看跌语句和调试应用程序之前,将断点权发生什么呢?实体中的价值是什么?如果您在该代码中添加日志语句会发生什么?出于某种原因你的JSP被调用了两次? –

回答

4

如果您正在使用数据存储实施计数器,则应该使用允许高吞吐量的技术。上述解决方案可能很容易每秒钟向数据存储写入数次,违反HRD策略。此外,它不是线程安全的(不在事务中运行,因此更新可能无序地应用,并且结果不符合您的期望)。尝试碎片计数器,解决这些问题:

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