我在JDO查询中看到了数小时陈旧的数据,以及来自App Engine数据存储区查看器控制面板的查询:
。 。
在实体编辑屏幕(可能使用祖先查询)上将其与以下内容进行比较:
。 。
我在一小时前将该值从.
更改为--none--
!我不知道为什么会这样,而且真气!
根据Google的GAE JDO documentation,查询应返回具有强一致性的值:
要覆盖单个查询的读取策略,请调用其addExtension()方法:
Query q = pm.newQuery(Person.class);
q.addExtension("datanucleus.appengine.datastoreReadConsistency", "EVENTUAL");
可能的值是" EVENTUAL"和" STRONG&#34 ;; 默认值为" STRONG" ,除非在配置文件jdoconfig.xml中另行设置。
嗯,这是我的jdoconfig.xml
- 没有提到datastoreReadConsistency
所以它必须正确使用STRONG
?
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
</persistence-manager-factory>
</jdoconfig>
我该怎么办呢?它让我发疯了!
答案 0 :(得分:0)
不幸的是,文档似乎有误或只是有点过时了。
使用High Replication数据存储区时,必须在强大和最终一致的操作之间进行权衡。全局查询,例如您问题中的查询are eventually consistent。
当最终的一致性为particularly painful时,您注意到了这一点,但这绝不是意料之外的。
对于需要强一致性的查询,您需要使用祖先查询来保证这一点。
我建议this article关于最终的一致性。