2

persistence.xml で次のプロパティを使用して、Eclipse indigo で EclipseLink の L2 キャッシュを無効にしようとしました。

<property name="eclipselink.cache.shared.default" value="false"/>

<shared-cache-mode>NONE</shared-cache-mode>

基本的に、2 つの異なるセッションで作成された同じオブジェクトがデータベースに 2 回ヒットするか、両方のセッションがメモリ キャッシュ内の以前のセッションで作成された同じオブジェクトを参照しているか、1 つのシナリオをテストしています。persistence.xml で上記のプロパティに言及することで L2 キャッシュが無効になっているため、そうすべきではありません。

私のコードは以下の通りです: -

 Session session = DataAccessManager.getManager().openSession();
 ReferenceObjectRepository referenceObjectRepository =     ReferenceObjectRepository.getInstance();
 ReferenceObjectKey referenceObjectKey = new ReferenceObjectKey(getStringValue("testCacheByPass.input"));
 //load object first time.
 ReferenceObject referenceObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey);
 logger.log(Level.SEVERE, "Cache ReferenceObject: " + referenceObject);

 //load object in another session
 Session sessionNew = DataAccessManager.getManager().openNewSession();
 Object dbObject = referenceObjectRepository.load(ReferenceObject.class,    referenceObjectKey);
 logger.log(Level.SEVERE, "DB loaded ReferenceObject: " + dbObject);

何か見逃しているかどうか助けてください。または、他の方法で行う必要がありますか??

4

2 に答える 2

3

呼び出しが行われる各関数にこの行を追加します。ビューを参照するときに検索機能で使用します。

((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();

この行は、クエリを実行する前にキャッシュをクリアします。

public Entity find(Object id) {
    ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();
    return em.find(Entity.class, id);
}
于 2012-10-25T19:33:35.247 に答える
1

オブジェクト キャッシュを無効にしましたが、まだクエリ キャッシュが有効になっていると思います。クエリキャッシュも無効にできるはずです

<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

クエリヒントでも同じことが設定できます。persistence.xml 構成が機能していないように見える場合は、クエリ ヒントを使用することもできます。

また、基本的に、キャッシュがなくても同じオブジェクトを比較することになるため、分離されていない限り同じである必要があります。

関連する質問:

于 2012-10-17T05:23:42.777 に答える