2010-10-13 58 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