#memcached #jdo #datanucleus #spymemcached
#memcached #jdo #datanucleus #spymemcached
Вопрос:
Я пытаюсь включить кэш L2 в моей установке JDO. Весенняя конфигурация:
<prop key="datanucleus.cache.level2.type">spymemcached</prop>
<prop key="datanucleus.cache.level2.memcached.servers">localhost:11211</prop>
таким образом, префиксом по умолчанию является «datanucleus».
Проблема в том, что любой объект с SingleFieldIdentity представлен ключом «datanucleus ###», где ### — строковое представление этого идентификатора БЕЗ имени класса в этом ключе.
Пример класса:
@PersistenceCapable(detachable="true", table="sites", cacheable="true")
public class Site
implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
public Long id;
}
У меня есть другие кэшируемые классы, например, учетная запись. Учетная запись с идентификатором 7 сохраняется в memecached как «datanucleus7», поэтому, когда сайт с идентификатором = 7 извлекается из кэша, все портится.
В пакете кэша datanucleus есть класс SpymemcachedLevel2Cache (SpymemcachedLevel2Cache.java ):
public class SpymemcachedLevel2Cache extends AbstractLevel2Cache
{
...
public CachedPC get(Object oid)
{
return (CachedPC) client.get(cacheName oid.toString());
}
...
}
Но oid.toString() для SingleFieldIdentity(например, LongIdentity) представляет собой простое число без информации о классе.
Итак, вопрос в том, как я могу изменить это поведение? Должен ли я переопределить SpymemcachedLevel2Cache, используя
if (nucleusCtx.getApiAdapter().isSingleFieldIdentity(id))
{
String targetClassName = nucleusCtx.getApiAdapter().getTargetClassNameForSingleFieldIdentity(id);
...
Комментарии:
1. Как вы заставили GAE работать с spymemcached? Единственная документация, которую я могу найти, говорит об использовании javax.cache.
Ответ №1:
Вчера включил эту функциональность в DataNucleus. У SVN trunk есть это