0

自一年前以来,我一直在使用 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>);
4

1 回答 1

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

也许这只是我的问题,但现阶段我无法判断。

我已经考虑了更多:

因此,让我们假设您建议的方式是有效的,并且您可以获得所需的正确工厂。真正的性能取决于你如何使用你的内存缓存。

1)如果你的内存缓存中有很多写入,那么这意味着 PersistenceManagerFactory 可能会经常被踢出缓存,这意味着你需要重新创建它。

2) 每次创建新的 PersistenceManagerFactory 时,您都会将缓存放入缓存,根据我处理 GAE 的经验,缓存非常不稳定,有时放入的部分可能比您预期的要长得多。

于 2012-06-05T23:53:00.057 回答