QueryOver的NHibernate二级缓存问题

时间:2011-10-14 12:10:29

标签: nhibernate fluent-nhibernate

当我使用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();
        }

我一定是错过了什么,只是无法弄清楚是什么。

1 个答案:

答案 0 :(得分:6)

有几个相关问题:

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

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