1

現在、バックエンドエンティティにアクセスするためにeclipselinkJPAプロバイダーを使用しています。データにアクセスするために名前付きクエリを使用し、クエリキャッシュで以下のオプションを使用しています。

@NamedQueries({
@NamedQuery(name = Supplier.FIND_ALL, query = "select o from Supplier o",hints={
      @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE),          
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE),
      @QueryHint(name = QueryHints.CACHE_STATMENT, value = HintValues.TRUE),
      @QueryHint(name = QueryHints.CACHE_STORE_MODE, value = "REFRESH"),
      @QueryHint(name = QueryHints.CACHE_RETRIEVE_MODE,value=CacheUsage.CheckCacheThenDatabase),
      }),
})

また、エンティティで以下のキャッシュオプションも使用しています。

@Cache(refreshOnlyIfNewer=true,
coordinationType=CacheCoordinationType.SEND_OBJECT_CHANGES,alwaysRefresh=true)

クエリは初めて時間がかかるようですが、さらに取得するにはかなり高速です(b'cozs of QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE)。しかし、その後のデータベースへの変更は、出力に反映されていないようです。キャッシュが更新されておらず、データベースへの更新された変更が出力に反映されていないようです。

同じ上で助けが必要です。

ありがとう、クリシュナ

4

1 に答える 1

2

あなたの設定はあまり意味がありません。

QueryHints.QUERY_RESULTS_CACHE は、クエリ キャッシュを有効にする正しい方法です。ただし、その他は設定しないでください。

QueryHints.CACHE_STATMENT - これは JDBC ステートメントのキャッシングです。クエリでこれを設定するのは非常に奇妙です。通常、これは DatabaseSource 内のすべてのステートメントに対して構成されるか、EclipseLink 接続プーリングを使用している場合は永続ユニット構成です。

QueryHints.CACHE_STORE_MODE - これが理にかなっているかどうかはわかりません。クエリを更新してキャッシュすることはできません。

QueryHints.CACHE_RETRIEVE_MODE,value=CacheUsage.CheckCacheThenDatabase、これは意味がありません。CacheUsage はこのプロパティではなく、CheckCacheThenDatabase はクエリ キャッシュを使用しているクエリでは意味がありません。

TopLinkには、「オブジェクト・キャッシュ」(IDによる)と「問合せキャッシュ」(問合せ名およびパラメータによる)の2種類のキャッシュがあります。クエリ キャッシュを有効にすると、クエリ結果は有効期限が切れるまでキャッシュされます。デフォルトでは有効期限はありませんが、有効期限を構成するか、手動でクエリ キャッシュをクリアすることができます。クエリ キャッシュは、データベースの変更によって更新されません。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cacheを参照して ください。

于 2012-12-17T14:58:35.797 に答える