今天,这是我第一次使用GWT和JDO。我正在本地 Debug模式下使用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();
}
}

我已经在<property name="datanucleus.appengine.datastoreReadConsistency" value="STRONG" />中设置了jdoconfig.xml。我是否需要在配置中设置其他事务内容?有人收到了有效的jdoconfig.xml吗?还是其他地方存在问题?之间有一些缓存?

编辑:我尝试过的事情:
  • 将NontransactionalRead/Write设置为false
  • 通过多次调用PersistenceManager来使用相同/不同的PMF.get().getPersistenceManager()
  • 使用事务
  • ignoreCache = PersistenceManager上为true
  • 调用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>
    

    我必须在这里错过一些重要的事情,因为所有方法都失败了...

    编辑2:当我将作业拆分为两个事务时,日志显示写事务被捕获,然后读事务开始。但是它找不到唯一的永久对象。它也总是说Level 1 Cache of type "weak" initialised。周是好还是坏?

    它大约有30%的请求出错了...可能是一些惰性查询加载问题吗?

    最佳答案

    Franz,JDO Config中的默认读取一致性为STRONG。因此,如果您尝试朝这个方向前进,它将不会带您到任何地方

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

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

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

    编辑 :

    由于在您提到的代码段中,它查询整个表。如果这是您需要的,则可以使用范围...
    使用它的方法是通过调用
    Extent ext = getExtent(<Entity Class name>)
    在persistenceManager单例对象上。然后,您可以遍历范围

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

    09-30 18:37