2

appengineでアプリを作成しましたが、問題が発生しています。PersistenceManagerFactoryは、リクエストごとにデータストアへの新しい接続を作成しているように見えます。私のデータストアの読み取りには、約10個のオブジェクトで4〜5秒かかるのが一般的です。(これは、すべてのエンティティレベルのクエリを取得します)。

appstatsを確認すると、データストアを呼び出す前に、リクエストが約3秒間そこにあるように見えます。実際のデータストア時間は4〜10ミリ秒と短いです。

次に、get allクエリを変更して、低レベルのDatastoreServiceAPIを使用しました。サービスを一度作成し、それをgetallメソッドで使用します。これにより、待機時間がほとんどなくなりました(メソッドが最初に呼び出されたときを除く)。したがって、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;
      }
4

1 に答える 1

1

この問題は、AppEngine データストア プラットフォームでの遅延の問題が原因でした。この問題は一時的なものであり、修正されました。この問題は、JDO を使用して AppEngine に初めてデプロイしたときにたまたま発生したため、これは私のコードであると考えました。今日再テストしたところ、はるかに高速に実行されています。

于 2013-02-04T16:06:59.683 に答える