2010-10-13 57 views
8

我正在開發一個Web應用程序,我希望緩存能夠跨Web請求持久化。 我知道第一級緩存僅限於每會話。我啓用了二級緩存,這對於查詢是有效的。NHibernate在跨會話使用SysCache緩存實體

但是,二級緩存似乎不適用於「獲取」實體......因此,應用程序所做的大部分數據庫工作並未跨Web請求緩存。

這是正常的/理想的行爲?我正在審查一個特殊的頁面,它會對數據庫進行大量往返訪問,儘管每個查詢都很快,但如果實體可以被緩存,這些似乎就不必要了。

編輯

好了,所以我啓用了二級緩存和查詢工作。我似乎無法讓它爲實體工作。我在我正在測試的主要實體上有Cache.Is(c => c.ReadWrite())(流利的nhibernate)。但是,不管怎樣,它仍然每次都擊中數據庫。有任何想法嗎?

編輯

我已經試過像這樣使用事務:

public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
     var accomm = Session.Get<Accommodation>(id); 
     tx.Commit(); 
     return accomm; 
    } 
} 

我的映射是這樣的(你可以看到我們有一個討厭的模式):

public void Override(AutoMapping<Core.Entities.Itinerary.Accommodation.Accommodation> mapping) 
{ 
    mapping.HasManyToMany(x => x.Features).Table("AccommodationLinkFeatureType").ChildKeyColumn("FeatureTypeId").NotFound.Ignore(); 
    mapping.HasManyToMany(x => x.SimilarAccommodation).Table("AccommodationLinkSimilarAccommodation").ChildKeyColumn("SimilarAccommodationId").NotFound.Ignore(); 
    mapping.HasMany(x => x.TourItinerary).Table("AccommodationTourItinerary"); 
    mapping.HasOne(x => x.Images).ForeignKey("AccommodationId").Cascade.All().Not.LazyLoad(); 
    mapping.References(x => x.CollectionType).NotFound.Ignore().Not.LazyLoad(); 
    mapping.References(x => x.AccommodationUnitType).NotFound.Ignore().Not.LazyLoad(); 
    Cache.Is(c => c.ReadWrite()); 
} 

但是,這似乎仍不能從二級緩存中獲取。

順便說一句,我看到很多的例子在線使用Cache.ReadWrite()但我只可以看到緩存助手的Is方法,所以我想Cache.Is(c => c.ReadWrite()) - 具有流暢的界面改變了嗎?

+1

最簡單的方法將被保存的NHibernate會話的web會話裏面,但我不建議這樣:P你或許應該解決您的二級高速緩存 - 讓你閱讀這篇文章:HTTP:// blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx? – rsenna 2010-10-13 16:09:13

+0

+1爲鏈接,但請參閱我的編輯 – 2010-10-13 16:53:56

+0

代碼+映射? – Paco 2010-10-13 18:43:35

回答

4

我還沒有測試過這個,但我的理解是,提交事務是將對象放入二級緩存的魔法。如果您正在執行事務外的讀取操作,那麼這些對象將不會被放置在二級緩存中。

+0

謝謝,我剛剛也發現了這一點。請參閱http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions – 2010-10-14 08:05:08

+0

實際上,這似乎並未解決問題。請參閱編輯。 – 2010-10-14 09:51:44

0

我有同樣的問題。 在我的情況下,原因是引用映射了NotFound()。Ignore()(即如果沒有發現實體與這個外鍵只是忽略它,這實際上是一個數據一致性錯誤)。刪除NotFound.Ignore並修復你的數據庫。

+0

一切都很好,除非您使用的遺留數據庫無法完全控制數據。 – 2011-05-19 08:07:23