6

NHibernate Profilerで、アソシエーションで熱心なフェッチを使用すると、HQLクエリで「左結合フェッチ」を使用するか、Criteriaクエリで.SetFetchMode()を使用すると、クエリがクエリキャッシュにキャッシュされなくなります。

実際、私が見ることができるのは、非常に基本的なクエリだけがキャッシュされていることです。誰かが私にどのクエリがキャッシュされ、どのクエリがキャッシュされないかについての洞察を私に与えることができれば、私は答えをマークします。

違いが生じる場合は、Memcachedを使用しています。クエリ密度の高いシステムのL2キャッシュに適した選択肢はありますか?

私はこれをかなり難しいと感じています-熱心な負荷を使用しない場合はN+1の問題があります(ただしキャッシュを使用します)。熱心な負荷を使用すると、データベースからすべてのエンティティを取得しますが、キャッシュはありません。

かなり太い境界線があるようです。どちらの戦略でもパフォーマンスが向上していますが、どちらの戦略も他の戦略からパフォーマンスを奪っています。

誰かがこの「太い線」のどこにあるのかについて洞察を与えることができれば、私は最適なパフォーマンスを得る必要があります、または「線を細くする」方法...私は非常に門戸を開いて答えをマークします。

4

3 に答える 3

5

更新:ここで 関連する質問を参照してください。要するに、すでに第 2 レベルのキャッシュにあるオブジェクトとの結合を避けるために、fetch="select" を使用してみてください。


私の以前の回答(まだ役に立つかもしれません)

クエリ キャッシュは、実際のオブジェクトではなく、クエリから返された識別子をキャッシュします

それを適切に使用するには、

  1. プレースホルダーを使用する (? または :varName)
  2. クエリキャッシュをtrueに設定します(あなたがしました)
  3. クエリは、プロパティではなくオブジェクトを返す必要があります ( from Foo、ないselect foo.bar from Foo foo)
  4. 返されたオブジェクトは、第 2 レベルのキャッシュにあるか、後続の呼び出しが同じ休止状態セッション (同じトランザクション) にある必要があります。

#4 を明確にするために、2 つの異なるトランザクションが正確な (キャッシュされた) クエリを正確なパラメーターで実行し、まったく同じオブジェクトを返すが、それが第 2 レベルのキャッシュにない場合、実際のオブジェクトを取得するためにデータベース ヒットが引き続き発生します (おそらくを選択してください)

クエリ キャッシュは 2 つの点で役立ちます - キャッシュされていないアイテムの HQL クエリに対して同じトランザクションでデータベースに再ヒットすることを回避し、HQL クエリに対して第 2 レベルのキャッシュ オブジェクトを利用できるようにします (ロードまたは取得コマンドで自動的に使用されます)。

それが森を一掃したことを願っています...

于 2009-12-28T17:20:47.453 に答える
1

NHibernate についてはわかりませんが、Hibernate では、ヒントを使用するクエリのクエリ キャッシュを明示的に有効にする必要があります。L2 キャッシュは個々のオブジェクトを自動的にキャッシュできますが、クエリの場合は明示的な指示が必要です。

于 2009-12-18T01:35:21.430 に答える
0

本当の答えではなく、ヒントです...コレクションとクエリの両方のキャッシュは、実際には結果を保存しません。結果のエンティティの識別子を格納するだけです。エンティティのデータを格納するエンティティ/クラス キャッシュです。

考えてみると、クエリが複数のエンティティ タイプを返す場合 (つまり、熱心な読み込み)、エンティティ間に関係があるため、id の配列を合理的に格納することはできません。キャッシュ自体は非常にシンプルな構造だと思います。

「値」クエリについてはわかりません。つまり、クラスの代わりにプロジェクションを使用するようなものです。これらをキャッシュすることはできません。しかし、私は間違っているかもしれません。

これは問題の解決に役立たないかもしれませんが、他にも役立つテクニックがあります。つまり、バッチ読み込みと適切なエンティティ キャッシュです。コレクションのキャッシュには注意が必要です。私は彼らに何度か噛まれました。

それが役立つことを願っています(少なくとも少し)。

于 2009-12-21T06:57:02.707 に答える