0

親エンティティ(私の場合)をロードしてキャッシュにUser入れると、 (所有されている関係にある)すべての子もキャッシュされるという問題があります。

私が間違っていなければ、説明は簡単です。シリアル化プロセスはオブジェクトのすべてのプロパティに影響を与えるため、すべての子オブジェクトもフェッチされます。最終的に、エンティティグループ全体がフェッチされます。

どうすればそれを回避できますか?Userエンティティグループには非常に多くの情報が含まれる予定であり、一度にすべてをキャッシュしたくありません。言うまでもなく、すべての子オブジェクトを一度にフェッチするのは非常に困難です。

私は修飾子に出くわしtransient、それが特定のフィールドのキャッシュを停止するだけでなく、それらのフィールドが永続化するのを防ぐことに気付くまで、しばらくの間幸せでした。

4

1 に答える 1

0

したがって、答えは、エンティティの切り離されたバージョンを使用することです。私は今このようなものに見える1つの関数を使用してすべてのエンティティをロードします:

@SuppressWarnings("unchecked")
E cachedEntity = (E) cache.get(cacheKey);

if (cachedEntity != null) {
    entity = cachedEntity;          
}
else {
    entity = pm.getObjectById(Eclass, key);
    cache.put(cacheKey, pm.detachCopy(entity));
}

欠点は、子オブジェクトを取得するときに、RPCentity = pm.makePersistent(entity)を生成するエンティティを明示的にアタッチし直す必要があることです。Datastore.GETただし、これはあまり頻繁には発生せず、子オブジェクトではなくエンティティ自体にアクセスしたいだけなので、非常に効率的です。

私はさらに良い解決策に出くわしました。JDOはエンティティがデータストアに実際に存在するかどうかをチェックするため、エンティティをアタッチするときに1つのRPC呼び出しがあります。また、DataNucleusのドキュメントによると、PMFでに設定datanucleus.attachSameDatastoreするだけでこれをオフにできます。falseただし、私には機能しませんDatastore.GET。オブジェクトをアタッチするときに常に呼び出されます。それが機能すれば、キャッシュからオブジェクトをフェッチした直後にすべてのオブジェクトを暗黙的にアタッチでき、コストはかかりません。必要に応じて手動でアタッチする必要はありません。

于 2012-08-21T11:44:04.350 に答える