我在appengine上創建了一個應用程序,但遇到了問題。在我看來,PersistenceManagerFactory正在爲每個請求創建到數據存儲的新連接。我的數據存儲讀取通常只需要大約10個對象需要4到5秒! (它是一個獲取所有實體級別的查詢)。JDOPersistenceManagerFactory正在永久創建PersistencManager
看過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上的第一個數據操作上分配連接。日誌會告訴你發生了什麼(在DEBUG級別),或者可能發生了什麼,直到數據存儲需要時間 – DataNucleus
我將不得不嘗試用幾種不同的方式編寫我的數據服務。我正在創建一個新的PersistenceManager並關閉它以便讀取。我在印象中(來自谷歌的例子),這是最好的做法。我將進行調試,並嘗試僅使用一個PersistenceManager作爲服務。 – aglassman
創建和關閉PM顯然是合理的用法(按照所有DataNucleus文檔)。也許您遇到了https://groups.google.com/forum/?fromgroups=#!topic/google-appengine/vkXLj3yxcyw – DataNucleus