2013-01-31 59 views
2

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

PMF沒有連接。 PM有連接。 PM的創建是微不足道的。通常在PM上的第一個數據操作上分配連接。日誌會告訴你發生了什麼(在DEBUG級別),或者可能發生了什麼,直到數據存儲需要時間 – DataNucleus

+0

我將不得不嘗試用幾種不同的方式編寫我的數據服務。我正在創建一個新的PersistenceManager並關閉它以便讀取。我在印象中(來自谷歌的例子),這是最好的做法。我將進行調試,並嘗試僅使用一個PersistenceManager作爲服務。 – aglassman

+0

創建和關閉PM顯然是合理的用法(按照所有DataNucleus文檔)。也許您遇到了https://groups.google.com/forum/?fromgroups=#!topic/google-appengine/vkXLj3yxcyw – DataNucleus

回答

1

的問題是由於AppEngine上的數據存儲平臺上的延遲問題。這個問題是暫時的,並且已經修復。這個問題恰好與我第一次使用JDO部署到AppEngine相同,所以我認爲這是我的代碼。我今天重新測試,運行速度更快。