Java JDOperateResistenceManagerFactory要花很长时间才能创建PersistenceManager
我在appengine上创建了一个应用程序,但遇到了一个问题。在我看来,PersistenceManagerFactory正在为每个请求创建到数据存储的新连接。我的数据存储读取通常只需要4到5秒就可以读取大约10个对象!(这是一个获取所有实体级别的查询) 在查看appstats之后,看起来在调用数据存储之前,请求在那里停留了大约3秒钟。实际数据存储时间很短,为4-10ms 然后,我将get all查询更改为使用低级DatastoreService api。我创建了一次服务,并在get all方法中使用它。这几乎消除了等待时间(除了第一次调用该方法)。所以我猜PMF每次读取都会获得到数据存储的新连接!这似乎很疯狂 有人知道如何最小化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方法
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;
}