我正在開發一個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())
- 具有流暢的界面改變了嗎?
最簡單的方法將被保存的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
+1爲鏈接,但請參閱我的編輯 – 2010-10-13 16:53:56
代碼+映射? – Paco 2010-10-13 18:43:35