gpt4 book ai didi

QueryOver 的 NHibernate 二级缓存问题

转载 作者:行者123 更新时间:2023-12-04 02:09:22 27 4
gpt4 key购买 nike

当我使用 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 配置:

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();
}

我一定是漏掉了什么,只是想不通是什么。

最佳答案

有几个相关的问题:

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

此外,请确保您为要缓存其查询的实体设置了实体缓存。否则缓存会使事情变得更糟。

关于QueryOver 的 NHibernate 二级缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com