我正在尝试在我的 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);
...