JDOPersistenceManagerFactory将永远创建PersistenceManager

时间:2013-01-31 17:42:50

标签: java google-app-engine jdo datanucleus

我在appengine上创建了一个应用程序,但遇到了问题。在我看来,PersistenceManagerFactory正在为每个请求创建一个到数据存储区的新连接。对于大约10个对象,我的数据存储区读取通常需要4到5秒! (它是一个获取所有实体级别的查询)。

在查看appstats之后,看起来请求在那里坐了大约3秒钟才能调用数据存储区。实际数据存储时间很短,为4-10ms。

然后我改变了我的get all查询以使用低级DatastoreService api。我创建了一次服务,并在get all方法中使用它。这几乎消除了等待时间(除了第一次调用该方法)。所以我猜测PMF正在为每次读取获得与数据存储区的新连接!这看起来很疯狂。

有谁知道如何最小化PersistenceManager实例的旋转时间?
jdoconfig.xml

   <persistence-manager-factory name="transactions-optional">
       <property name="javax.jdo.PersistenceManagerFactoryClass"
           value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>
       <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.singletonPMFForName" value="true"/>
   </persistence-manager-factory>

getAll方法(使用jdo)

    @Override
    public ArrayList<CrudObject> getAll(String className) {
        List results = null;
        PersistenceManager pm = pmf.getPersistenceManager();
        try{
            Query q = pm.newQuery(Class.forName(className));
            results = (List)q.execute();
            return new ArrayList<CrudObject>(pm.detachCopyAll(results));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally
        {
            pm.close();
        }
        return null;
      }

1 个答案:

答案 0 :(得分:1)

问题是由AppEngine数据存储平台上的延迟问题引起的。这个问题是暂时的,并已得到修复。这个问题恰好与我第一次使用JDO部署到AppEngine相吻合,所以我认为这是我的代码。我今天重新测试了,它运行得更快。