代码之家  ›  专栏  ›  技术社区  ›  Meidan Alon

NHibernate查询缓存和WCF

  •  3
  • Meidan Alon  · 技术社区  · 16 年前

    我已经为我的一个查询启用了查询缓存,当我运行测试或控制台应用程序时,它运行良好(查询结果取自查询缓存,实体取自二级缓存)。 然而,如果我通过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
    

    以下是NH的日志,显示了非WCF服务时的缓存命中率:

    [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;
        }
    

    为什么缓存没有被命中?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Anton Gogolev    16 年前

    你确定你不是在重新创造吗 SessionFactory 每一个请求?或者你通常没有进行不必要的重新初始化?

    推荐文章