我正在开发一个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