实体计数在实体获取之前不会更新

时间:2013-04-10 13:58:21

标签: java google-app-engine

我的GAE数据存储区实验发现了一些相当奇怪的东西。我正在使用GAE SDK 1.7.5。 我不确定我的发现是否正确。

基本上,我发现将实体放入数据存储区并进行计数并不会返回正确的值,直到执行数据存储区获取为止。

如果你想深入挖掘这里是我以前的SO问题的实际代码:

Persistence strategies for High Replication environment (Google App Engine)

我也尝试使用类似的库:https://github.com/koher/Koherent-App-Engine-Library-for-Java

我正在经历同样的发现。任何人都可以帮我澄清我看到的这个问题吗?

2 个答案:

答案 0 :(得分:2)

我假设您在本地开发服务器上获得此结果并启用了最终一致性?

由于数据存储的最终一致性行为,您未获得正确的计数。就是这样。

在开发服务器上,像get()这样的一致操作将导致后续查询显示一致的结果。这与生产服务器的行为并不完全相同。

答案 1 :(得分:0)

您遇到了HRD的最终一致性属性。

Count使用索引来获取结果。保存新实体后,索引是异步构建的,这导致get put总是返回结果(强一致性),query put之后get不保证立即返回结果(最终一致性)。

文档在这个主题上有点模糊,但它确实提到put强制“应用”阶段后put,可能导致索引也被应用:参见第1节Life Of The Datastore Write的“返回值”。

所以query然后put无法保证给您预期的结果,但getquery和{{1}}是(至少是这样的我读了文档)。这可以解释你的发现。