Идентификатор одиночного поля кэша JDO L2

#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 есть это