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