8

アプリケーションの存続期間中、できれば初めて呼び出された後、キャッシュしたい状態のコレクションがあります。永続性プロバイダーとしてEclipseLinkを使用しています。私のEJB3エンティティには、次のコードがあります。

@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クエリを監視すると、SessionBeanがこのNamedQueryを使用するたびに選択が実行されます。

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

編集:私は次のようにクエリを呼び出しています:

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

3 に答える 3

9

ここに投稿された解決策は私にとってはうまくいきませんでした。しかし、私はそれを次のように動作させました:

@Cache
@NamedQueries({@NamedQuery(
      name = "State.findAll",
      query = "SELECT s FROM State s", 
      hints = {
          @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE)
      }
    )})
于 2010-07-26T15:01:05.260 に答える
0

クエリ ヒントを追加するだけで、EclipseLink 1.0.1 キャッシュが動作するようになりました。

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

エンティティをまったく変更しておらず、注釈を使用してキャッシュを構成しようとしていません。

于 2009-03-23T09:24:40.907 に答える
0

ここでは推測ですが、試してみてください

query.cacheQueryResults();

あなたがそれを作成した後、あなたの前にgetResultList

-- マーカスQ

于 2009-02-25T05:41:38.697 に答える