获取实体组计数始终返回0

时间:2014-02-18 10:26:02

标签: java google-app-engine

GAE official doc之后我尝试在我的本地开发环境(单元测试)中测试它,遗憾的是实体组计数总是返回0:

    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
    MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();

    Entity entity1 = new Entity("Simple");
    Key key1 = ds.put(entity1);
    Key entityGroupKey = Entities.createEntityGroupKey(key1);
    //should print 1, but 0
    showEntityGroupCount(ds, memcacheService, entityGroupKey);

    Entity entity2 = new Entity("Simple", key1);
    Key key2 = ds.put(entity2);
    //should print 2, but still 0
    showEntityGroupCount(ds, memcacheService, entityGroupKey);
下面的

是从the doc复制的,以供快速参考:

// A simple class for tracking consistent entity group counts
class EntityGroupCount implements Serializable {
  long version; // Version of the entity group whose count we are tracking
  int count;
  EntityGroupCount(long version, int count) {
    this.version = version;
    this.count = count;
  }
}

// Display count of entities in an entity group, with consistent caching
void showEntityGroupCount(DatastoreService ds, MemcacheService cache, PrintWriter writer,
                          Key entityGroupKey) {
  EntityGroupCount egCount = (EntityGroupCount) cache.get(entityGroupKey);
  if (egCount != null && egCount.version == getEntityGroupVersion(ds, null, entityGroupKey)) {
    // Cached value matched current entity group version, use that
    writer.println(egCount.count + " entities (cached)");
  } else {
    // Need to actually count entities. Using a transaction to get a consistent count
    // and entity group version.
    Transaction tx = ds.beginTransaction();
    PreparedQuery pq = ds.prepare(tx, new Query(entityGroupKey));
    int count = pq.countEntities(FetchOptions.Builder.withLimit(5000));
    cache.put(entityGroupKey,
              new EntityGroupCount(getEntityGroupVersion(ds, tx, entityGroupKey), count));
    tx.rollback();
    writer.println(count + " entities");
  }
}

有关此问题的任何想法?提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于方法嵌套,Entities.createEntityGroupKey()被调用两次。改变两次出现的

showEntityGroupCount(ds, memcacheService, entityGroupKey);

showEntityGroupCount(ds, memcacheService, key1);

并显示正确的计数(无论如何都在开发环境中)。