1

nhibernate.cfg.xml ファイルに class-cache を設定しました。

Id でエンティティを取得すると、オブジェクトが読み込まれると SQL リクエストが表示されません。

しかし、基準を使用してエンティティをフェッチすると、常に SQL クエリが発生します...

編集:

これは私の質問に答えると思います:

http://www.javalobby.org/java/forums/t48846.html

名前などの ID で直接検索するよりも、より複雑なクエリに基づいてエントリを検索したいとしましょう。この場合、Hibernate は引き続き SQL ステートメントを発行して、クエリのベース データセットを取得する必要があります。たとえば、このコードは次のようになります。

Query query = session.createQuery("from Person as p where p.firstName=?"); query.setString(0, "ジョン"); リスト l = query.list(); ...単一の選択を呼び出します(関連付けがキャッシュされていると仮定します)。

select * from Person where firstName='John' この 1 つの選択で '1' が返され、すべてがキャッシュされているため、他のすべてのルックアップにキャッシュが使用されます。この必須の単一選択は、クエリ キャッシュの出番です。

4

1 に答える 1

2

編集」がすべての回答を見つけたことを意味するかどうかはわかりません。Hibernate は、キャッシング メカニズムを 2 つの領域に分割します。

1 つ目は、前述の「クラス」キャッシュです。特定の ID (Session.Get(id);、参照されるプロパティ、コレクション) を持つオブジェクトに対するすべての要求、クラス キャッシュを使用できます。

2 つ目は「クエリ」キャッシュです。その場合、キャッシュに使用されるキーは、渡された に依存しCriteriaます。これらは結果セット (where、order by、top ...) を取得するために使用されました。この場合にキャッシュされるは、そのクエリによって返される一連の ID です。

そのため、後で同じ基準が適用されると、キャッシュされた一連の ID が返され、(ID によって) クラス キャッシュからキャッシュされたエンティティが再利用されます。

(特定のシナリオがプロジェクションに適用され、最新の NHibernate バージョンでもキャッシュされる可能性があります。その場合、結果には一意の ID を持つエンティティは含まれませんが、一連の列が含まれます。ID ベースのキャッシュには適合しませんが、機能しています。バージョン 3.3 は私のためにそれを行っています)

したがって、最終的に答えるには:

しかし、基準を使用してエンティティをフェッチすると、常に SQL クエリが発生します...

クエリ キャッシュも許可する必要があります。

<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>

第 2 レベルのキャッシュが許可され、ID を持つオブジェクトを格納できます。また、クエリ キャッシュのサポートが有効になっているため、同じ基準の組み合わせの 2 番目の呼び出しは、SQL サーバーにはまったく送信されません。

クエリの例をキャッシュする:

criteria.SetCacheable(true)
    .SetCacheMode(CacheMode.Normal)
    .SetCacheRegion("LongTerm");
于 2012-10-28T08:14:59.427 に答える