有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Get实体组计数始终返回0

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) 个答案

  1. # 1 楼答案

    实体。方法嵌套导致createEntityGroupKey()被调用两次。更改两次出现的

    showEntityGroupCount(ds, memcacheService, entityGroupKey);
    

    showEntityGroupCount(ds, memcacheService, key1);
    

    并且正确的计数会出现(无论如何,在开发环境中)