我在一年前开发Google App Engine,我理解实例的预热时间有多重要。 所以我最终得出一个想法:是否有可能在memcache中缓存单例?例如,我使用JDO PersistenceManagerFactory的单例模式。
这是我的实际代码(如文档中所述):
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>);
答案 0 :(得分:1)
编辑:刚发现这个链接,似乎不同的实例不能根据Ikai Lan在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的经验,这个缓存非常不稳定,有时候放入部分可能需要比预期更长的时间。