2017-02-13 6 views
0

2番目からデータをフェッチするために使用されるEclipse Link 2.3.2/2.6.1でヒントが動作しないレベルキャッシュ 使用するヒントEclipse Linkで使用する場合、javax.persistence.cache.retrieveModeおよびjavax.persistence.cache.retrieveModeがNamedQueryで機能しないORM

@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") 

以下のオプションを試してみてください。

1. Added JPA Hints to Named query itself 
@NamedQuery(
name = TestEntity.FIND_BY_CODE, 
query = "select t from Test t where t.code = :code", 
hints = { 
@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") }) 

2. Adding hints to the Entity Manager Itself after injecting it 
em.setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE); 
em.setProperty("javax.persistence.cache.storeMode", CacheRetrieveMode.USE); 

3. Added JPA hints at the time of Query execution 
em.createNamedQuery(TestEntity.FIND_BY_CODE, 
AlertCategoryType.class).setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE) 
.setHint("javax.persistence.cache.storeMode", CacheStoreMode.USE) 
.setParameter("code", code).getSingleResult(); 

上記ヒントの使用方法はありませんでした。次に私は、これらのヒントを設定した後に形成されたデータベースベースのクエリ は、以下のキー/値のペアとしてヒントを渡していることを発見した3つの異なるオプションでデバッグを試みました。

eclipselink.query.hints => {javax.persistence.cache.retrieveMode=USE,                              javax.persistence.cache.storeMode=USE} 

ここで、JPLヒントを設定しても、eclipselink.query.hintsはキーです。これは私たちがこれを変更することを支配していないものです。
私は以下のようにEclipse Linkから提供されたヒントを渡すと、期待どおりに動作し始め、結果はキャッシュから取得され、DBでは取得されません。

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 

これは、Eclipseリンクを使用すると、Queryで表示される[上の図]のキーに従ってEclipse Linkのヒントのみを認識することを意味します。

JPAは、私が使用している

環境の作業が

  • Eclispeリンク2.3.2/2.6.1
  • ランニンフィンGlassfishの4.1 [ペーシュ・カショーロを果たしているヒントを得るために周りのすべての作業を提案して下さい]あなたは状態
  • Java8/JEE7

答えて

1

クエリヒントが働いている(eclipselink.query-結果キャッシュ)クエリー結果の新しいキャッシュを作成するので、同じクエリーを次に実行すると結果はすでに存在するため、クエリーを再度実行する必要はありません。これは、第2レベルのキャッシュの外側(超えている)です。

作業していないと指定した設定は、第2レベルのキャッシュに影響します。詳しい情報がなければ、私は彼らが期待どおりに働く可能性が高いと述べるつもりです。クエリがデータベースに送られただけであっても、キャッシュが使用されていないわけではありません。エンティティをキャッシュすることは、結果をクエリにキャッシュすることとはまったく異なります。クエリ結果がキャッシュされていない場合、メモリ内クエリを有効にしていない限り、ほとんどすべてのタイプのクエリをデータベースに送信して、どのエンティティを構築して返す必要があるかを判断する必要があります。それから、EclipseLinkはこれらの結果を使用してキャッシュをチェックします。エンティティがすでに存在し、そのまま返されると、データからエンティティを再構築するオーバーヘッドが回避されます。

エンティティがキャッシュされているかどうかは、ID値を使用するem.find()または読み取りクエリを使用して確認できます。キャッシュはIDで索引付けされているため、必要なエンティティを特定するためにデータベースに移動する必要はありません。

関連する問題