JDO L2 Cache SingleFieldIdentity

时间:2011-10-11 17:49:44

标签: memcached jdo datanucleus spymemcached

我正在尝试在JDO安装中启用L2缓存。 Spring配置是:

<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。 id为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());
    }
...
}

但SingleFieldIdentity的oid.toString()(例如LongIdentity)是一个没有类信息的简单数字。

所以问题是:我怎样才能改变这种行为?我应该使用

重新实现SpymemcachedLevel2Cache
if (nucleusCtx.getApiAdapter().isSingleFieldIdentity(id))
    {
        String targetClassName = nucleusCtx.getApiAdapter().getTargetClassNameForSingleFieldIdentity(id);
    ...

1 个答案:

答案 0 :(得分:1)

昨天在DataNucleus中包含了该功能。 SVN主干有它