【问题标题】:NHibernate query cache not usedNHibernate 查询缓存未使用
【发布时间】:2011-05-19 01:47:18
【问题描述】:

我正在使用 NH 2.1.2.4。

我有这样的 Fluent NHibernate 查询缓存设置:

MsSqlConfiguration.MsSql2005
    .Cache(c => c.UseQueryCache()
            .ProviderClass(typeof(NHibernate.Caches.SysCache2.SysCacheProvider)))

我的标准如下所示:

Session.CreateCriteria<Employee>()
    .Add(Restrictions.Eq("Username", username))
    .SetMaxResults(1)
    .SetCacheable(true)
    .UniqueResult<Employee>();

但是,当我使用 SQL Profiler 时,我可以看到查询仍然始终针对数据库执行。不会对 Employee 表进行任何插入或更新。 为什么它不起作用?

我的 Employee 映射类将 Employee 指定为可缓存,如下所示:

public sealed class EmployeeDbMap : ClassMap<Employee>
{
    public EmployeeDbMap()
    {
        ....

        Cache.ReadWrite();
    }
} 

顺便说一句,我看到 Stackoverflow 上有很多相关问题,但似乎没有一个很好的答案:herehere

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    如果您也没有缓存 Employee 实体,则需要一个查询来加载它,因为查询缓存将结果存储为 id。

    此外,NHibernate 缓存仅在您在事务中完成所有工作(包括查询)时才有效。

    【讨论】:

    • “不缓存 Employee 实体”是什么意思? Employee 被映射为可缓存的。你的意思是在某个时刻之前的 Session.Load() 必须被调用?我还需要做些什么吗?
    • @cbp: @cbp: 这就是我的意思。如果 Employee 被映射为可缓存,它应该可以工作。也可以查看添加的关于交易的评论。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2012-10-20
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多