我的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
我正在经历同样的发现。任何人都可以帮我澄清我看到的这个问题吗?
答案 0 :(得分:2)
我假设您在本地开发服务器上获得此结果并启用了最终一致性?
由于数据存储的最终一致性行为,您未获得正确的计数。就是这样。
在开发服务器上,像get()这样的一致操作将导致后续查询显示一致的结果。这与生产服务器的行为并不完全相同。
答案 1 :(得分:0)
您遇到了HRD的最终一致性属性。
Count使用索引来获取结果。保存新实体后,索引是异步构建的,这导致get
put
总是返回结果(强一致性),query
put
之后get
不保证立即返回结果(最终一致性)。
文档在这个主题上有点模糊,但它确实提到put
强制“应用”阶段后put
,可能导致索引也被应用:参见第1节Life Of The Datastore Write的“返回值”。
所以query
然后put
无法保证给您预期的结果,但get
,query
和{{1}}是(至少是这样的我读了文档)。这可以解释你的发现。