JDO L2 Cache SingleFieldIdentity - PullRequest
       12

JDO L2 Cache SingleFieldIdentity

0 голосов
/ 11 октября 2011

Я пытаюсь включить кэш 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;
}

У меня есть другие кешируемые классы, например Account. Учетная запись с идентификатором 7 хранится в memecached как «datanucleus7», поэтому, когда сайт с id = 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 Ответ

1 голос
/ 13 октября 2011

Включил эту функциональность в DataNucleus вчера. У багажника SVN есть это

...