App-Engine JDO一致阅读不起作用,也许是缓存?

Fra*_*fka 5 eclipse gwt google-app-engine jdo datanucleus

今天,这是我第一次使用GWT和JDO.我在本地调试模式下使用Eclipse运行它.

我做了以下事情:

    public Collection<MyObject> add(MyObject o) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
    pm.makePersistent(o);
    Query query = pm.newQuery(MyObject.class);// fetch all objects incl. o. But o only sometimes comes...
List<MyObject> rs = (List<MyObject>) query.execute();
ArrayList<MyObject> list= new ArrayList<MyObject>();
for (MyObject r : rs) {
    list.add(r);
}
return list; 
} finally {
    pm.close();
}
}
Run Code Online (Sandbox Code Playgroud)

我已经入住<property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" />jdoconfig.xml.我是否必须在配置中设置其他一些事务?有人有工作jdoconfig.xml吗?或者是其他地方的问题?一些缓存介于两者之间?

编辑:我尝试过的事情:

  • 将NontransactionalRead/Write设置为false
  • 使用相同/不同PersistenceManager虽然PMF.get().getPersistenceManager()多次调用
  • 使用交易
  • ignoreCache = true on PersistenceManager
  • 打电话flushcheckConsistency

jdoconfig:

    <persistence-manager-factory name="transactions-optional">
<property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" />
    <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"/>
</persistence-manager-factory>
Run Code Online (Sandbox Code Playgroud)

因为所有方法都失败了,我必须在这里遗漏一些内容......

编辑2:当我将作业拆分为两个事务时,日志表示写入事务已捕获,然后读取事务开始.但它没有找到刚才持久的对象.它总是说也是Level 1 Cache of type "weak" initialised.周是坏还是好?

大约30%的请求出错了......我可能会遇到一些懒惰的查询加载问题吗?

Hri*_*esh 2

Franz,JDO 配置中的默认读取一致性是“强”。所以如果你试图朝那个方向接近它,它不会带你到任何地方

检查一下,因为我认为它提到了与您遇到的场景类似的内容,提交的数据未在查询中返回。正如所提到的,它不是并发的,但它解释了提交过程。

http://code.google.com/appengine/articles/transaction_isolation.html

另外,另一种方法是使用范围进行查询,并查明这是否可以解决您正在查看的特定用例,因为我相信您正在提取表中的所有记录。

编辑 :

因为在您提到的代码片段中,它查询整个表。如果这就是您需要的,您可以使用 Extent...使用它的方法是调用

Extent ext = getExtent(<Entity Class name>)

在 persistenceManager 单例对象上。然后您可以迭代 Extent

查看文档并在此处的页面上搜索范围。 http://code.google.com/appengine/docs/java/datastore/jdo/queries.html