【问题标题】:NHibernate 2nd Level Cache issue with QueryOverQueryOver 的 NHibernate 二级缓存问题
【发布时间】:2011-10-14 12:10:28
【问题描述】:

当我使用 Session.Get() 时,我的二级缓存工作正常,但是如果我在 NH3.0 中使用新的 QueryOver API,缓存不会被命中。

这很好用:

public TEntity Get(int id)
{
  return session.Get<TEntity>(id);
}

这不会命中缓存:

public TEntity Get(Expression<Func<TEntity bool>> filter)
{
    var query = _session.QueryOver<TEntity>()
                .Where(filter);

    query.Cacheable();     
    return query.SingleOrDefault();
}

我正在使用事务来确保正确使用二级缓存。

这是我的会话配置:

Session = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
                .Mappings(x => x.FluentMappings.AddFromAssemblyOf<Activity>())
                .Cache(c => c.UseSecondLevelCache()
                            .UseQueryCache()
                            .ProviderClass<NHibernate.Cache.HashtableCacheProvider>())
                .ExposeConfiguration(cfg => configuration = cfg)
                .BuildSessionFactory()
                .OpenSession();

我正在设置我的实体以供缓存使用:

public class CommentMap : ClassMap<Comment>
    {
        public CommentMap()
        {
            Cache.ReadWrite();

            Id(x => x.Id);
            Map(x => x.Message);
            References(x => x.Activity);
            References(x => x.User);
        }
    }

我正在对我的 QueryOver 查询调用 Cacheable 方法:

public TEntity Get(Expression<Func<TEntity, bool>> filter)
        {
            var query = _session.QueryOver<TEntity>()
                .Where(filter);

            query
                .Cacheable();

            return query.SingleOrDefault();
        }

我一定是错过了什么,只是想不通。

【问题讨论】:

  • 请注意我之后的所有读者!该问题似乎已被编辑以反映正确的实现,这可能就是 Diegos 的答案被标记为正确的原因......

标签: nhibernate fluent-nhibernate


【解决方案1】:

有几个相关的问题:

  • Session.Load 从不访问数据库,因此不能证明缓存有效
  • 查询缓存与实体缓存分开启用
  • 查询缓存是显式的:您必须告诉 NHibernate 使用 Cacheable() 方法缓存 QueryOver

此外,请确保您对要缓存其查询的实体进行实体缓存。否则缓存会让事情变得更糟。

【讨论】:

  • 我确实启用了查询和实体缓存,并且我正在 QueryOver 上调用 Cacheable() 方法。我会在星期一对照代码检查你的清单,看看我是否遗漏了什么。谢谢。
  • 到底是什么问题?是你有 query.Cacheable() 然后返回 query.SingleOrDefault() (而不是做 query = query.Cacheable())?还是你找到别的东西了。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多