4

同じNHibernateという名前のクエリを同じパラメーターで2回(毎回異なるセッション)実行する単純な単体テストがあります。これは単純なintパラメーターであり、私のクエリは名前付きクエリであるため、これら2つの呼び出しは同一であり、結果をキャッシュする必要があると想定しています。

実際、ログで結果がキャッシュされていることがわかりますが、キーは異なります。したがって、2番目のクエリ結果がキャッシュに見つかりません。

これが私のログからの抜粋です(キーがどのように異なるかに注意してください):

(最初のクエリ)

DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)>-新しいデータの追加:key = [snipped] ...パラメーター:['809']; 名前付きパラメーター:{} @ 743460424&value = System.Collections.Generic.List`1 [System.Object]

(2番目のクエリ)

DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)>-新しいデータの追加:key = [snipped] ...パラメーター:['809']; 名前付きパラメーター:{} @ 704749285&value = System.Collections.Generic.List`1 [System.Object]

クエリキャッシュを使用するようにNHibernateを設定しました。そして、これらのクエリをcacheable=trueに設定しています。他にどこを見ればいいのかわからない。誰か提案がありますか?

ありがとう
-マイク

4

1 に答える 1

2

わかりました-私はこれを理解しました。次の構文を使用して、名前付きクエリを実行していました。

IQuery q = session.GetNamedQuery("MyQuery")
                .SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
                .SetCacheable(true)
                .SetCacheRegion("MyCacheRegion");

(これは、私が付け加えるかもしれませんが、NHibernateのドキュメントがそれを行う方法を正確に教えている方法です..しかし、私は逸脱します;)

クエリごとに新しいAliasToBeanTransformerを作成する場合、各クエリオブジェクト(キャッシュのキー)は一意になり、キャッシュヒットが発生することはありません。したがって、要するに、nhibドキュメントが言うようにそれを行うと、キャッシュは機能しません。

代わりに、静的メンバー変数でトランスフォーマーを1回作成し、それをクエリに使用すると、キャッシュが機能します-次のようになります。

private static IResultTransformer myTransformer = Transformers.AliasToBean(typeof(MyDTO))

..。

IQuery q = session.GetNamedQuery("MyQuery")
                    .SetResultTransformer(myTransformer)
                    .SetCacheable(true)
                    .SetCacheRegion("MyCacheRegion");
于 2010-05-04T19:38:08.463 に答える