2011-10-11 61 views
0

我想在我的JDO安装中启用L2缓存。 Spring配置如下:JDO L2缓存SingleFieldIdentity

<prop key="datanucleus.cache.level2.type">spymemcached</prop> 
<prop key="datanucleus.cache.level2.memcached.servers">localhost:11211</prop> 

所以前缀是默认的 “DataNucleus将”。

问题是任何具有SingleFieldIdentity的对象都由键“datanucleus ###”表示,其中###是该键中的该标识WITHOUT类名的字符串表示形式。

Sample类:

@PersistenceCapable(detachable="true", table="sites", cacheable="true") 
public class Site 
implements Serializable { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    public Long id; 
} 

我还有另外一个缓存类,例如帐户。 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()); 
    } 
... 
} 

但是oid.toString()为SingleFieldIdentity(e.g LongIdentity)与无级信息的简单数。

所以问题是:我该如何改变这种行为?我应该重新实现SpymemcachedLevel2Cache使用

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

你是如何让GAE与spymemcached一起工作的?我可以找到的唯一文档说使用javax.cache。 – eeeeaaii

回答

1

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