Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDOperateResistenceManagerFactory要花很长时间才能创建PersistenceManager_Java_Google App Engine_Jdo_Datanucleus - Fatal编程技术网

Java JDOperateResistenceManagerFactory要花很长时间才能创建PersistenceManager

Java JDOperateResistenceManagerFactory要花很长时间才能创建PersistenceManager,java,google-app-engine,jdo,datanucleus,Java,Google App Engine,Jdo,Datanucleus,我在appengine上创建了一个应用程序,但遇到了一个问题。在我看来,PersistenceManagerFactory正在为每个请求创建到数据存储的新连接。我的数据存储读取通常只需要4到5秒就可以读取大约10个对象!(这是一个获取所有实体级别的查询) 在查看appstats之后,看起来在调用数据存储之前,请求在那里停留了大约3秒钟。实际数据存储时间很短,为4-10ms 然后,我将get all查询更改为使用低级DatastoreService api。我创建了一次服务,并在get all方法

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

在查看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)

@覆盖
公共ArrayList getAll(字符串类名称){
列表结果=空;
PersistenceManager pm=pmf.getPersistenceManager();
试一试{
Query q=pm.newQuery(Class.forName(className));
结果=(列表)q.execute();
返回新的ArrayList(pm.detachCopyAll(results));
}catch(classnotfounde异常){
e、 printStackTrace();
}最后
{
pm.close();
}
返回null;
}

该问题是由于AppEngine数据存储平台上的延迟问题造成的。这个问题是暂时的,已经解决了。这个问题恰好与我第一次使用JDO部署到AppEngine的时间一致,所以我认为这是我的代码。我今天重新测试了,它运行得更快。

PMF没有连接。PM有一个连接。PM的创建非常简单。连接通常在PM上的第一次数据操作上分配。日志会告诉您发生了什么(在调试级别),或者可能会告诉您在数据存储占用时间之前发生了什么。我将不得不尝试几种不同的方法来编写数据服务。我正在创建一个新的PersistenceManager,并在每次读取时关闭它。我的印象是(从谷歌的例子中)这是最好的做法。我将进行调试,并尝试只为服务使用一个PersistenceManager。创建和关闭PM显然是一种合理的用法(根据所有DataNucleus文档)。也许你遇到了一些类似的问题,比如《谢谢你给这个主题的链接》。经过测试,我确信我的延迟是由于他们在论坛中描述的延迟问题造成的。我只是运气不好,这些问题恰好与我第一次部署到应用程序引擎的时间一致!我结束这个问题。
    @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;
      }