2009-02-25 5 views
8

私は、アプリケーションの寿命の間、好ましくは最初に呼び出された後にキャッシュしたい状態のコレクションを持っています。永続化プロバイダとしてEclipseLinkを使用しています。私は、次のコードを持っている私のEJB3エンティティで:EclipseLinkでクエリキャッシュを設定する方法

@Cache 
@NamedQueries({ 
    @NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
       @QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
       @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE) 
      } 
    ) 
}) 

これは私がMySQLへ行くのSQLクエリを監視する場合、それはまだ私のセッションBeanは、このNamedQueryを使用して選択するたびに行い、しかし何もしていないようです。

このクエリがデータベースから一度だけ読み込まれるように、できればすべてのセッションにわたってこのクエリを構成する正しい方法は何ですか?

編集:ここだけの推測

Query query = em.createNamedQuery("State.findAll"); 
List<State> states = query.getResultList(); 
+0

EclipseLinkのセッション/キャッシュ設定を理解するのに最適です。私は決してできなかった。 – cletus

答えて

0

が、あなたがそれを作成した後、あなたは

query.cacheQueryResults(); 

を試みるかもしれませんが、あなたgetResultList前:私はこのようなクエリを呼び出しています。

- 私はちょうどクエリヒントを追加することによって動作するのEclipseLink 1.0.1キャッシュを得ましたMarkusQ

+0

これはどのように動作するかについて詳しく説明できますか? JPA QueryオブジェクトはcacheQueryResults()メソッドをサポートしていません。代わりにReadObjectQueryを作成すると、どのようにリストを要求するのか分かりません。 – rustyshelf

+0

eclipselinkの特別クエリを使用しない場合は、ヒントを使用する必要があります。 Andre氏が説明したように、またはquery.setHint(QueryHints.QUERY_RESULTS_CACHE、HintValues.TRUE) – Pau

0

Query query = em.createNamedQuery("Person.find"); 
query.setParameter("NAME", name);  
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); 
return (Person)query.getSingleResult(); 

私は全くのエンティティを変更していない、まだ試していません注釈を使用してキャッシュを構成します。

8

ここに掲載されているソリューションは私には役に立たなかった。しかし、私はそれを使って動作させました:

@Cache 
@NamedQueries({@NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) 
     } 
    )}) 
+0

を介して注釈を使用して行うことができます.2番目のレベルのキャッシュを使用する場合は、QueryHints.CACHE_USAGEを使用します。 Andreが述べたように、クエリキャッシュを使用する必要があるヒントは次のとおりです。QueryHints.QUERY_RESULTS_CACHE – Pau

+0

クエリでキャッシュを使用するために '@ Cache'アノテーションは必要ありません – Atais

関連する問題