4

1 つのセッションで何度も呼び出される関数があります。NHibernate の第 1 レベル キャッシュに関する私の理解では、呼び出し回数に関係なく、同じセッション内の正確なクエリは 1 回だけ実行されます。

しかし、そうではありません。以下はスニペットで、関数が呼び出されるたびに NHProfiler でクエリが実行されていることがわかります。

    public List<CustomerType> GetAllActiveCustomerTypes()
    {
        return _unitOfWork.CurrentSession.QueryOver<CustomerType>().Where(x => x.Active).List();
    }

ここでNHibernateを理解するのに何か欠けていますか?

ありがとう

4

1 に答える 1

4

あなたの経験は正しいです。クエリは、セッションの第 1 レベルのキャッシュによってキャッシュされません。理解を深めるために、これを読んでください: NHibernate での First and Second Level caching

一次キャッシュの抜粋:

...第 1 レベルのキャッシュは ID マップとも呼ばれ、データベースへのラウンド トリップの回数を減らしてアプリケーションの速度を向上させるだけでなく、オブジェクトの 2 つの異なるインスタンスが存在しないことを保証するためにも使用されます。同じIDを持っている...

... NHibernate を使用する場合、標準のセッション オブジェクトを使用している限り、最初のレベルのキャッシュが自動的に有効になります... NHibernate がデータベースから一意の ID でエンティティをロードしている場合、エンティティはいわゆる ID マップに自動的に配置されます。 ..

前述のように、entityキャッシュの目的で使用されます。

第 2 レベルのキャッシュの抜粋:

  • ... 個々のエンティティまたは集計全体を第 2 レベルのキャッシュにキャッシュできます。
  • ... 2 番目のレベルのキャッシュに (複雑で時間のかかる) クエリをキャッシュすることもできます。
于 2013-01-12T06:25:32.107 に答える