Google App Engine Objectify - 加载单个对象或键列表?

时间:2014-12-30 01:03:34

标签: java google-app-engine objectify

我正在努力掌握Go​​ogle App Engine编程,并想知道这两种方法之间的区别是什么 - 如果有实际差异的话。

方法A)

public Collection<Conference> getConferencesToAttend(Profile profile)
{
    List<String> keyStringsToAttend = profile.getConferenceKeysToAttend();
    List<Conference> conferences = new ArrayList<Conference>();
    for(String conferenceString : keyStringsToAttend)
    {
        conferences.add(ofy().load().key(Key.create(Conference.class,conferenceString)).now());
    }
    return conferences; 
}

方法B)

public Collection<Conference> getConferencesToAttend(Profile profile)
    List<String> keyStringsToAttend = profile.getConferenceKeysToAttend();
    List<Key<Conference>> keysToAttend = new ArrayList<>();
    for (String keyString : keyStringsToAttend) {
        keysToAttend.add(Key.<Conference>create(keyString));
    }
    return ofy().load().keys(keysToAttend).values();
}

“conferenceKeysToAttend”列表保证只有唯一的会议 - 即使我选择了两个备选方案中的哪一个呢?如果是这样,为什么?

2 个答案:

答案 0 :(得分:5)

方法A逐个加载实体,而方法B执行批量加载,这样更便宜,因为您只需要向Google的数据中心进行一次网络往返。你可以通过测量两种方法在多次加载一串键时所花费的时间来观察这一点。

在进行批量加载时,如果数据存储区操作引发异常,则需要对加载的实体保持谨慎。即使没有加载某些实体,操作也可能成功。

答案 1 :(得分:0)

答案取决于列表的大小。如果我们谈论数百或更多,你不应该做一个批次。我无法找到文件的限制,但是有一个限制。如果不是那么多,一定要一个一个地加载。但是,您应该通过不使用now函数来使调用异步:

List<<Key<Conference>> conferences = new ArrayList<Key<Conference>>();    
conferences.add(ofy().load().key(Key.create(Conference.class,conferenceString));

当您需要实际数据时:

for (Key<Conference> keyConference : conferences ) {
    Conference c = keyConference.get();
......
    }