我正在尝试保存一个对象,并确认它刚刚保存,但它似乎没有工作。
这是我的对象
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]
}
以下是保存然后尝试加载的代码。
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();
但是“newOne”对象为null。即使我完成了保存它。我做错了什么?
- Update-- 如果我稍后尝试(比如几分钟之后),有时候我会看到这个对象,但是在保存后却没有。这是否与高复制存储有关?
答案 0 :(得分:7)
前段时间有相同的行为,并在google groups上提出问题 - 客观化
我得到了答案:
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
我还有另一个很好的答案来处理行为
对于删除,查询键然后批量获取实体。确保 你的获取被设置为强一致性(虽然我相信这是 默认)。对于已删除的实体,batch-get应返回null。 添加时,它会变得有点棘手。索引更新可能需要一些时间 秒。 AFAIK,有三种方法可以解决这个问题:1;使用预先计算 结果(完全避免查询)。如果您的下一个视图是用户的 最近创建的实体,在用户中保留这些键的列表 实体,并在创建新实体时更新该列表。那份清单 永远是新鲜的,不需要查询。除了避免陈旧 索引,这也加快了你的应用程序。你的结果就越多 可以可靠地管理,您可以避免的查询越多。
2;通过最近使用“增强”查询结果来隐藏延迟 添加实体。根据您添加实体的速率, 要么只注入最新的密钥,要么将其与 1中的解决方案。
3;通过让用户浏览一些未受影响的视图来隐藏延迟 登陆基于查询的视图之前。这个策略肯定有 闻到它的味道。您需要确保这些额外步骤是相关的 给用户,或者你会给你一个糟糕的经历。
蝴蝶,Joakim
你可以在这里阅读:
类似问题的另一个好答案:Objectify doesn't store synchronously, even with now