在memcache中缓存单例

时间:2012-06-05 22:17:59

标签: java google-app-engine memcached jdo datanucleus

我在一年前开发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>);

1 个答案:

答案 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的经验,这个缓存非常不稳定,有时候放入部分可能需要比预期更长的时间。