2011-10-11 77 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