3

クエリの 1 つでクエリ キャッシュを有効にしました。テストまたはコンソール アプリケーションを実行すると、正常に動作します (クエリ結果はクエリ キャッシュから取得され、エンティティは第 2 レベル キャッシュから取得されます)。ただし、WCF サービスを介して同じクエリを実行すると、キャッシュがヒットすることはありません。

どちらの場合もログを確認しましたが、キャッシュ ミスが発生するまでは実質的に同じです。

キャッシュが置かれたことを示すNHのログは次のとおりです。

[25,4244] 16:15:18,237 DEBUG[NHibernate.Cache.StandardQueryCache]: caching query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>;    first row: 0
[25,4244] 16:15:18,238 DEBUG[NHibernate.Caches.SysCache.SysCache]: adding new data: key=NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter>    ; first row: 0@-891130694&value=System.Collections.Generic.List`1[System.Object]

キャッシュミスを示すNHのログは次のとおりです。

[25,4244] 16:15:29,089 DEBUG[NHibernate.Cache.StandardQueryCache]: checking cached query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>; first row: 0
[25,4244] 16:15:29,089 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter>; first row: 0@519257116' from the cache.
[25,4244] 16:15:29,095 DEBUG[NHibernate.Cache.StandardQueryCache]: query results were not found in cache: sql: <MyQuery>; parameters: <MyParameter>; first row: 0

WCF サービスにない場合のキャッシュ ヒットを示す NH のログは次のとおりです。

[11,3656] 17:37:48,718 DEBUG[NHibernate.Cache.StandardQueryCache]: checking cached query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>; first row: 0
[11,3656] 17:37:48,718 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter>; first row: 0@-369095952' from the cache.
[11,3656] 17:37:48,728 DEBUG[NHibernate.Cache.StandardQueryCache]: Checking query spaces for up-to-dateness <MyTableName>
[11,3656] 17:37:48,729 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:UpdateTimestampsCache:<MyTableName>@-1403193414' from the cache.
[11,3656] 17:37:48,729 DEBUG[NHibernate.Cache.StandardQueryCache]: returning cached query results for: sql: <MyQuery>; parameters: <MyParameter>; first row: 0

クエリを実行するために使用しているコードは次のとおりです。

    using (ISession session = SessionFactory.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        IList<T> entities = session
            .CreateCriteria(typeof(T))
            .SetCacheable(true)
            .Add(expression)
            .List<T>();
        transaction.Commit();
        return entities;
    }

キャッシュがヒットしないのはなぜですか?

4

1 に答える 1

1

SessionFactoryリクエストごとに再作成していませんか? または、一般的に不必要な再初期化を行っていないということですか?

于 2009-10-07T14:35:21.167 に答える