使用Objectify和GAE不保存的对象

b-r*_*yce 8 google-app-engine loading objectify

我正在尝试保存一个对象并验证它是否立即保存,并且它似乎没有工作.

这是我的目标

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;

@Entity
public class PlayerGroup {
    @Id public String n;//sharks
    public ArrayList<String> m;//members [39393,23932932,3223]

}
Run Code Online (Sandbox Code Playgroud)

这是保存然后尝试加载的代码.

        playerGroup = new PlayerGroup();
        playerGroup.n = reqPlayerGroup.n;
        playerGroup.m = reqPlayerGroup.m;
        ofy().save().entity(playerGroup).now();
        response.i = playerGroup;
        PlayerGroup newOne = ofy().load().type(PlayerGroup.class).id(reqPlayerGroup.n).get();
Run Code Online (Sandbox Code Playgroud)

但是"newOne"对象为null.即使我完成了保存它.我究竟做错了什么?

- 更新 - 如果我稍后尝试(比如几分钟之后),我有时会看到对象,但保存后却没有.这与高复制存储有关吗?

Dan*_*iel 7

前段时间有相同的行为,并在谷歌小组上提出一个问题 - 客观化

我得到了答案:

You are seeing the eventual consistency of the High-Replication 
Datastore.  There has been a lot of discussion of this exact subject 
on the Objecify list in google groups , including several links to the 
Google documentation on the subject. 

Basically, any kind of query which does not include an ancestor() may 
return results from a stale view of the datastore. 

Jeff 
Run Code Online (Sandbox Code Playgroud)

我还得到另一个很好的答案来处理这种行为

对于删除,查询键然后批量获取实体.确保你的获取被设置为强一致性(虽然我相信这是默认的).对于已删除的实体,batch-get应返回null.添加时,它会变得有点棘手.索引更新可能需要几秒钟.AFAIK,有三种方法可以解决这个问题:1; 使用预先计算的结果(完全避免查询).如果您的下一个视图是用户最近创建的实体,请在用户实体中保留这些键的列表,并在创建新实体时更新该列表.该列表将始终是新鲜的,无需查询.除了避免陈旧的索引,这也加快了你的应用程序.您可以可靠地管理的结果集越多,您可以避免的查询就越多.

2; 通过使用最近添加的实体"增强"查询结果来隐藏延迟.根据您添加实体的速率,只注入最新的密钥,或者将其与1中的解决方案结合使用.

3; 在登陆基于查询的视图之前,通过让用户浏览一些未受影响的视图来隐藏延迟.这个策略肯定有一种气味.您需要确保这些额外步骤与用户相关,否则您将获得糟糕的体验.

蝴蝶,Joakim

你可以在这里阅读:

为什么我删除一个对象后我不使用异步api我仍然在删除后立即进行的查询中获取它或者在我添加一个之后没有得到它


对类似问题的另一个好的答案:即使现在,Objectify也不会同步存储