0

我正在尝试在我的 JDO 安装中启用 L2 缓存。弹簧配置为:

<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 的帐户作为“datanucleus7”存储到 memecached 中,因此当从缓存中提取 id=7 的站点时,一切都搞砸了。

在datanucleus缓存包中有一个类SpymemcachedLevel2Cache(SpymemcachedLevel2Cache.java):

public class SpymemcachedLevel2Cache extends AbstractLevel2Cache
{
...
    public CachedPC get(Object oid)
    {
        return (CachedPC) client.get(cacheName + oid.toString());
    }
...
}

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

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

if (nucleusCtx.getApiAdapter().isSingleFieldIdentity(id))
    {
        String targetClassName = nucleusCtx.getApiAdapter().getTargetClassNameForSingleFieldIdentity(id);
    ...
4

1 回答 1

1

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

于 2011-10-13T17:22:47.243 回答