AppEngine上 - 查询数据库,把东西

问题描述:

在一个地方的代码之后我做这样的事情:AppEngine上 - 查询数据库,把东西

FormModel(.. some data here..).put() 

和几行下面我从数据库中选择:

FormModel.all().filter(..).fetch(100) 

问题我注意到 - 有时候抓取并不会注意到我刚添加的数据。

我的理论是发生这种情况是因为我使用高复制存储,并且我没有足够的时间来复制数据。但是我怎样才能避免这个问题呢?

除非数据在同一个实体组中,否则无法保证数据将最高达数据(如果I understand this section正确)。

+0

谢谢。这似乎是原因。 – kolinko

+0

我会保持这个问题的一天,以防有人提供某种方式来等待申请/强制申请.. – kolinko

+0

@Merlin,是保持开放,这是一个非常无能的问题,我自己的项目,我没有想要迁移到HRD,除非有这种解决方案。 –

Shay说得对:没有办法知道数据存储何时准备好返回刚输入的数据。

但是,你保证,一旦调用put成功完成数据将被输入最终,。这是很多信息,你可以用它来解决这个问题。当你从fetch得到数据时,只需追加/插入你知道最终会在那里的新实体!在大多数情况下,我认为在每个请求的基础上这样做会很好,但是您可以做更强大的功能,使用memcache来覆盖所有请求(除非memcache失败)。

困难的部分,当然是搞清楚什么时候应该追加/插入哪些实体。必须采取这种解决方法是令人厌恶的,但以相对较低的代价来支付与HRD一样惊人复杂的事情。

+0

是啊,这是我的“B计划” - 我宁愿更简化的解决方案:) – kolinko

+0

我认为这是现在存在的最佳解决方案。我可以想象一个库自动扫描最近放置的实体以便包含在查询中并得到结果,但我没有听说过它。 –

https://developers.google.com/appengine/docs/java/datastore/transactions#Java_Isolation_and_consistency

这种一致的快照视图,还延伸到后读取写入 内部交易。与大多数数据库不同,查询并在数据存储区事务中获取 ,因此看不到在该事务中写入的前 的结果。 具体来说,如果某个实体被修改为 或在事务中被删除,那么查询或获取将返回原始的 版本的实体,如果该实体不存在,则返回该实体的版本号或 。