【问题标题】:JDOPersistenceManagerFactory is taking forever to create PersistencManagerJDOPersistenceManagerFactory 花费很长时间来创建持久性管理器
【发布时间】:2013-01-31 17:42:50
【问题描述】:

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

查看 appstats 后,看起来请求在调用数据存储区之前会在那里停留大约 3 秒。实际的数据存储时间很小,4-10ms。

然后我将获取所有查询更改为使用低级别的 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;
      }

【问题讨论】:

  • PMF 没有连接。 PM 有一个连接。 PM的创建是微不足道的。连接通常在 PM 上的第一个数据操作上分配。日志会告诉你正在发生什么(在调试级别),或者可能在数据存储需要时间之前发生了什么
  • 我将不得不尝试几种不同的方式来编写我的数据服务。我正在创建一个新的 PersistenceManager 并为每次读取关闭它。我的印象(来自谷歌的例子)这是最好的做法。我将进行调试,并尝试只为服务使用一个 PersistenceManager。
  • 创建和关闭 PM 显然是一种合理的用法(根据所有 DataNucleus 文档)。也许您遇到了 AppEngine 问题,例如 groups.google.com/forum/?fromgroups=#!topic/google-appengine/…
  • 感谢您提供该主题的链接。经过测试,我现在确实相信我的延迟是由于他们在论坛中描述的延迟问题。我很不幸,这些问题与我第一次部署到 app-engine 时不谋而合!我要结束这个问题了。

标签: java google-app-engine jdo datanucleus


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2021-11-17
    • 1970-01-01
    • 2016-08-14
    • 2015-01-17
    • 2016-04-05
    相关资源
    最近更新 更多