App Engine JDO数据存储区查询返回陈旧数据 - 2个小时

时间:2015-04-10 21:07:42

标签: java google-app-engine jdo google-cloud-datastore

我在JDO查询中看到了数小时陈旧的数据,以及来自App Engine数据存储区查看器控制面板的查询:

Entity in query

。 。

  

在实体编辑屏幕(可能使用祖先查询)上将其与以下内容进行比较:

。 。

Entity in entity viewer

我在一小时前将该值从.更改为--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>

我该怎么办呢?它让我发疯了!

1 个答案:

答案 0 :(得分:0)

不幸的是,文档似乎有误或只是有点过时了。

使用High Replication数据存储区时,必须在强大和最终一致的操作之间进行权衡。全局查询,例如您问题中的查询are eventually consistent

当最终的一致性为particularly painful时,您注意到了这一点,但这绝不是意料之外的。

对于需要强一致性的查询,您需要使用祖先查询来保证这一点。

我建议this article关于最终的一致性。