Java 应用程序引擎数据存储-将属性增量增加2

Java 应用程序引擎数据存储-将属性增量增加2,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我正在尝试构建一个简单的应用程序引擎数据存储实体,它基本上记录了它的浏览次数。我已经在一个JSP文件中设置了代码,它确实增加了变量,但是每次它似乎都增加了2而不是1。这是有问题的代码 DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Entity story = datastore.get(KeyFactory.stringToKey(request.getParameter("

我正在尝试构建一个简单的应用程序引擎数据存储实体,它基本上记录了它的浏览次数。我已经在一个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吗?我甚至试着在得到视图数时减去一,但是这个数字就像你所期望的那样一直保持不变。真的很奇怪。

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


如果要使用数据存储实现计数器,则应使用允许高吞吐量的技术。您上面的解决方案可以轻松地每秒写入数据存储超过几次,从而违反HRD策略。而且,它不是线程安全的(不是在事务中运行的,因此更新可能会无序应用,并且您的结果不是您所期望的)。尝试碎片计数器,它可以解决以下问题:


如果在put语句前面放置断点并调试应用程序,会发生什么情况?实体中的值是多少?如果在代码中放入log语句,会发生什么?您的JSP是否因为某种原因被调用了两次?如果您将断点放在put语句之前并调试应用程序,会发生什么情况?实体中的值是多少?如果在代码中放入log语句,会发生什么?您的JSP是否因为某种原因被调用了两次?