2012-06-05 30 views
0

自從一年前我開發Google App Engine並且我瞭解實例的熱身時間有多重要。 所以我最終提出了一個想法:是否有可能在memcache中緩存單例?例如,我爲JDO PersistenceManagerFactory使用了單例模式。在memcache中緩存單例

這裏是我的實際代碼(如文檔中所述):

private static PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory(<my-name>); 

是否有任何意義類似延長的JDOHelper,寫這樣一個功能:

public static PersistenceManagerFactory getPersistenceManagerFactoryCached(String name) { 
    MemcacheService cache = MemcacheServiceFactory.getMemcacheService();; 
    PersistenceManagerFactory staticPMF= null; 
    if (cache.contains("JDO_PMF")) { 
     staticPMF = (PersistenceManagerFactory) cache.get("JDO_PMF"); 
    } else { 
     staticPMF = JDOHelper.getPersistenceManagerFactory(name); 
     cache.put("JDO_PMF", staticPMF); 
    } 
    return staticPMF; 
} 

我的想法應緩存PersistenceManagerFactory以加速第一個實例,然後將其作爲單例使用:

private static PersistenceManagerFactory pmfInstance = JDOHelperCached.getPersistenceManagerFactory(<my-name>); 
+1

如果您擔心開銷,請停止使用JDO。 PMF必須加載一大堆與您的應用無關的數據 - 使用更適合該任務的內容,如Objectify,將會避免這種情況。 –

回答

1

編輯:剛剛發現這個環節,似乎根據Ikai蘭在https://groups.google.com/group/google-appengine-java/browse_thread/thread/1b90fae408b52d49

不同的情況下,不能共享PersistenceManagerFactory的實例======================== ==================================================

我喜歡這個主意,和我已經試過馬上在我的代碼,但不幸的是我得到了一些錯誤是這樣的:

javax.jdo.JDOFatalUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o 

也許這只是我的問題,但我不能在這個階段告訴。

我已經想過這個更多:

因此,讓我們假設你的建議是工作的方式,你可以得到正確的工廠需要。真正的性能取決於你如何使用你的memcache。

1)如果你的memcache中有很多寫入,那麼這意味着PersistenceManagerFactory可能會經常從緩存中被踢出,這意味着你需要重新創建它。 2)每次你創建一個新的PersistenceManagerFactory,你都會放入緩存中,根據我處理GAE的經驗,這個緩存很不穩定,有時候放置會比預期的花費更多的時間。

+0

uhm ..我不完全同意,可能我錯過了一些東西。從我的觀點來看,它在每個GAE實例中總是單身。所以它比以前更好。由於這種情況的「最壞情況」(memcache中沒有JDO_PMF)是普通類的常見場景:對於每個加熱請求,它創建一個新的JDO單例 –

+0

我不認爲每個GAE實例都會有單例,因爲memcache服務由所有實例共享。 –

+0

好吧,在這種情況下,我同意它。這取決於我們稱之爲「singleton」:我的意思是,每個GAE實例只有一個PersistenceManagerFactory類的實例。肯定它緩存在memcache中,但是每個JVM在每個GAE實例上運行都有自己的PersistenceManagerFactory。你是否同意在任何情況下都比通常的方法更好? –