我在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
我在做什麼錯了?
http://opensource.atlassian.com/projects/hibernate/browse/HHH-3339雖然它在會話級別,但此錯誤文章看起來類似。如果我在刷新後重置SessionFactory,緩存將再次開始工作。但重置SessionFactory會重置所有二級緩存。在保存後在同一個會話工廠中執行相同的查詢時,是否可能會出現時間戳錯誤? – 2010-09-03 05:55:21
沒有人有任何建議可能會出現什麼問題嗎? – 2010-09-07 06:43:17
A [更詳細的答案](/ a/14301438/1178314)現在可用於near dup問題。 – 2016-03-08 09:10:14