NHibernate二级缓存问题与QueryOver
当我使用Session.Get()时,我的二级缓存工作得非常好,但是如果我在NH3.0中使用新的QueryOver API,缓存不会被命中 这非常有效:NHibernate二级缓存问题与QueryOver,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,当我使用Session.Get()时,我的二级缓存工作得非常好,但是如果我在NH3.0中使用新的QueryOver API,缓存不会被命中 这非常有效: public TEntity Get(int id) { return session.Get<TEntity>(id); } public TEntity Get(int-id) { 返回会话.Get(id); } 这不会命中缓存: public TEntity Get(Expression<Func<TEnt
public TEntity Get(int id)
{
return session.Get<TEntity>(id);
}
public TEntity Get(int-id)
{
返回会话.Get(id);
}
这不会命中缓存:
public TEntity Get(Expression<Func<TEntity bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query.Cacheable();
return query.SingleOrDefault();
}
public TEntity Get(表达式过滤器)
{
var query=\u session.QueryOver()
.其中(过滤器);
query.Cacheable();
返回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();
Session=fluent.Configure()
.Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
.Mappings(x=>x.FluentMappings.AddFromAssemblyOf())
.Cache(c=>c.UseSecondLevelCache()
.UseQueryCache()
.ProviderClass())
.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);
}
}
public-class-CommentMap:ClassMap
{
公共地图()
{
Cache.ReadWrite();
Id(x=>x.Id);
Map(x=>x.Message);
参考文献(x=>x.Activity);
参考文献(x=>x.User);
}
}
我正在对QueryOver查询调用可缓存方法:
public TEntity Get(Expression<Func<TEntity, bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query
.Cacheable();
return query.SingleOrDefault();
}
public TEntity Get(表达式过滤器)
{
var query=\u session.QueryOver()
.其中(过滤器);
查询
.Cacheable();
返回query.SingleOrDefault();
}
我肯定错过了什么,只是不知道是什么。有几个相关问题:
从不命中数据库,因此不能证明缓存工作正常Session.Load
- 查询缓存与实体缓存分开启用
- 查询缓存是显式的:您必须告诉NHibernate使用
方法缓存Cacheable()
QueryOver
另外,请确保为要缓存其查询的实体提供实体缓存。否则缓存会让事情变得更糟。我确实启用了查询和实体缓存,我正在QueryOver上调用Cacheable()方法。星期一我会对照代码检查你的清单,看看我是否遗漏了什么。谢谢。最后,出了什么问题?是不是在query.Cacheable()之后返回query.SingleOrDefault()(而不是执行query=query.Cacheable())?或者你发现了别的什么。给我之后的读者留言!这个问题似乎被编辑以反映正确的实现,这可能就是为什么Diegos的答案被标记为正确。。。