代码之家  ›  专栏  ›  技术社区  ›  Juho Rutila

更新数据库后NHibernate查询缓存不工作

  •  2
  • Juho Rutila  · 技术社区  · 16 年前

    我在FluentNHibernate中启用了二级缓存:

    Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2005
                .ConnectionString(connectionString)
                .Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())
                )
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PersonMap>());
    

        public PersonMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            Cache.ReadWrite();
        }
    

    当我从存储库中调用人员时,我运行:

        var query = session.GetSession().CreateCriteria<Person>("p")
            .Add(Expression.Eq("p.Org.Id", orgRep.GetOrg().Id));
        query.SetCacheable(true);
        return query.List<Person>().AsQueryable<Person>();
    

    当我启动应用程序时,一切(包括缓存)都正常工作。我的第一个查询将命中数据库,但下面的查询不会。当我保存此人时,问题就出现了。人得救的方式如下:

    public virtual void Save(Person p)
    {
      if (p.Id > 0 && session.GetSession().Get<Person>(p.Id).Org != orgRep.GetOrg())
                throw new SecurityException("Organization mismatch");
      session.GetSession().Merge(p);
      session.GetSession().Flush();
    }
    

    保存工作,但之后缓存不工作。查询将始终命中数据库。查看nhibernate日志显示:

     DEBUG - Checking query spaces for up-to-dateness [[Person]]
     DEBUG - Fetching object 'NHibernate-Cache:UpdateTimestampsCache:[Person]@1639794674' from the cache.
     DEBUG - cached query results were not up to date for: sql: SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Org_id as Org5_0_0_ FROM [Person] this_ WHERE this_.Org_id = ?; parameters: ['1']; first row: 0
    

    1 回复  |  直到 16 年前
        1
  •  1
  •   Nick Ryan    14 年前

    尝试使用block在会话中实例化显式事务。这篇文章看起来相关:- http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions