2012-06-05 3 views
0

Я развиваюсь в Google App Engine с года назад, и я понимаю, насколько важно время прогрева для экземпляров. Итак, у меня появилась идея: можно ли кэшировать одноэлемент в memcache? Например, я использую шаблон singleton для JDO PersistenceManagerFactory.Кэширование singleton в 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

Edit: Просто найти эту ссылку, кажется, разные экземпляры не могут разделить PersistenceManagerFactory экземпляра в соответствии с Ikai Lan на 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 

может быть, это только моя проблема, но я не могу сказать на данном этапе.

Я думал об этом больше:

Итак, давайте предположим, как вы предлагаете работает, и вы можете получить нужную фабрику вам нужно. Реальная производительность будет зависеть от того, как вы используете свой memcache.

1) Если у вас много записей в вашем memcache, то это означает, что потенциально PersistenceManagerFactory можно часто выкидывать из кеша, а это значит, что вам нужно создать его снова.

2) Каждый раз, когда вы создаете новый PersistenceManagerFactory, вы попадаете в кеш, который, согласно моему опыту работы с GAE, довольно неустойчив, а иногда отчасти может потребоваться гораздо больше времени, чем вы ожидали.

+0

Умм. Я не совсем согласен, возможно, что-то не хватает. С моей точки зрения, это всегда одноэлемент в каждом случае GAE. Так что он работает лучше, чем раньше. Поскольку «худший сценарий» этого случая (без JDO_PMF в memcache) является распространенным сценарием для обычного класса: для каждого запроса на разогрев он создает новый сингл JDO –

+0

. Я не думаю, что каждый экземпляр GAE будет иметь один синглтон, потому что служба memcache используется всеми экземплярами. –

+0

Хорошо, в этом случае я согласен. Это зависит от того, что мы называем «singleton»: я имею в виду, что для каждого экземпляра GAE будет только один экземпляр класса PersistenceManagerFactory. Конечно, он кэшируется в memcache, но каждый JVM который работает на каждом экземпляре GAE, имеет свой собственный PersistenceManagerFactory. Согласны ли вы с тем, что в любом случае это лучше, чем обычный подход? –

Смежные вопросы