0

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);
    ...
4

1 に答える 1

1

昨日、その機能を DataNucleus に組み込みました。SVNトランクにはそれがあります

于 2011-10-13T17:22:47.243 に答える