【问题标题】:Can first level cache be used with ICriteria or other APIs?一级缓存可以与 ICriteria 或其他 API 一起使用吗?
【发布时间】:2011-02-07 09:21:13
【问题描述】:

NHibernate 中,使用LoadGet 方法时,您可以轻松地从一级缓存中受益。但是ICriteriaHQLLinq-to-NHibernateQueryOver 呢?他们也使用一级缓存吗?

【问题讨论】:

    标签: nhibernate caching icriteria first-level-cache


    【解决方案1】:

    他们使用它来返回实体,但查询直接进入数据库,除非您使用二级缓存。

    考虑一下:

    var fooUsingGet = session.Get<Foo>(fooId);
    var fooQueryById = session.Query<Foo>().Single(f => f.Id == fooId);
    

    执行了两个查询(一个用于 Get,一个用于 Query),但两个变量都包含相同的对象引用。

    现在,如果您启用二级缓存、查询缓存并为查询指定缓存:

    var fooQueryById = session.Query<Foo>().Cacheable()
                              .Single(f => f.Id == fooId);
    var fooQueryByIdAgain = session.Query<Foo>().Cacheable()
                                   .Single(f => f.Id == fooId);
    

    只会执行一个查询。

    【讨论】:

    • 只是给未来的人的提示:在您的第一个代码块中,(后跟查询)确实执行了两个查询。但是,更改顺序(查询后跟获取),您只会看到一个 - 因为第一级缓存启动 - 查询启动缓存。这与 ayendes "Get, Load, query by Id" 文章相反——但这似乎引用了早期版本的 linq 驱动程序
    【解决方案2】:

    不,据我了解,他们没有。他们只使用二级缓存。一级缓存仅适用于GetLoad

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2017-10-15
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多