java - 在 memcache 中缓存单例

标签 java google-app-engine memcached jdo datanucleus

我从一年前就开始在 Google App Engine 中进行开发,并且我了解实例的预热时间有多么重要。 所以我最终产生了一个想法:是否可以在内存缓存中缓存单例?例如,我正在为 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>);

最佳答案

编辑:刚刚找到此链接,根据 Ikai Lan 的说法,不同的实例似乎无法共享 PersistenceManagerFactory 实例 https://groups.google.com/group/google-appengine-java/browse_thread/thread/1b90fae408b52d49

================================================== ===========================

我喜欢这个想法,并且我立即尝试了我的代码,但不幸的是我遇到了一些这样的错误:

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 的经验,该缓存非常不稳定,有时放入部分可能需要比您预期的时间长得多的时间。

关于java - 在 memcache 中缓存单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905773/

相关文章:

java - 如何返回存储在memcache中的所有值?

php_memcache.dll vc6 X64?

java - 如何使用 XML 协议(protocol)检测网络流中的 "EOF"?

java - 用 vector 生成二维世界

java - 避免已存在的更新验证并在 Spring MVC 中进行更新

Java 停止进程并关闭流

java - 将 urlconnection 文件从 App Engine java 保存到 Google 云存储

android - Firebase 服务帐户凭据 Json 读取权限被拒绝

php - 如何在 MacOS High Sierra 上为 php@7.1 安装 memcached 模块?

java - NHibernate 的 Memcached 提供程序无法正常工作