gpt4 book ai didi

java - JDOPersistenceManagerFactory 需要永远创建持久性管理器

转载 作者:行者123 更新时间:2023-11-30 11:36:12 24 4
gpt4 key购买 nike

我在 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;
}

最佳答案

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

关于java - JDOPersistenceManagerFactory 需要永远创建持久性管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com