JDO インストールで L2 キャッシュを有効にしようとしています。春の構成は次のとおりです。
<prop key="datanucleus.cache.level2.type">spymemcached</prop>
<prop key="datanucleus.cache.level2.memcached.servers">localhost:11211</prop>
したがって、プレフィックスはデフォルトの「datanucleus」です。
問題は、SingleFieldIdentity を持つすべてのオブジェクトがキー "datanucleus###" で表されることです。ここで、### は、そのキーのクラス名なしの ID の文字列表現です。
サンプルクラス:
@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);
...