2012-06-05 29 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。你是否同意在任何情况下都比通常的方法更好? –