2010-09-02 116 views
2

我在FluentNHibernate啓用2級緩存:NHibernate的查詢緩存到數據庫

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 

我在做什麼錯了?

+0

http://opensource.atlassian.com/projects/hibernate/browse/HHH-3339雖然它在會話級別,但此錯誤文章看起來類似。如果我在刷新後重置SessionFactory,緩存將再次開始工作。但重置SessionFactory會重置所有二級緩存。在保存後在同一個會話工廠中執行相同的查詢時,是否可能會出現時間戳錯誤? – 2010-09-03 05:55:21

+0

沒有人有任何建議可能會出現什麼問題嗎? – 2010-09-07 06:43:17

+0

A [更詳細的答案](/ a/14301438/1178314)現在可用於near dup問題。 – 2016-03-08 09:10:14

回答

0

嘗試在會話中使用塊實例化顯式事務。這篇文章看起來很相關: - http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

+0

你很好回答了這個問題。其實我認爲我們最終通過使用交易得到了它。使用事務對二級緩存至關重要。 – 2012-03-23 07:06:51