使用SysCache跨会话的NHibernate缓存实体

时间:2010-10-13 15:53:19

标签: nhibernate second-level-cache

我正在开发一个Web应用程序,我希望缓存能够持续存储Web请求。 我知道第一级缓存只是每个会话。我启用了二级缓存,这适用于查询。

但是,二级缓存似乎不适用于“获取”实体...因此,应用程序所做的大部分数据库工作都不会在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()的示例,但我只能在Cache帮助器上看到Is方法,所以我正在尝试Cache.Is(c => c.ReadWrite()) - 说得流利界面改变了吗?

3 个答案:

答案 0 :(得分:4)

我没有测试过这个,但我的理解是提交事务是将对象放入二级缓存的神奇之处。如果您在事务之外进行读取操作,则对象将不会放在二级缓存中。

答案 1 :(得分:0)

我遇到了同样的问题。 在我的情况下,原因是引用与NotFound()映射.Ignore()(即如果没有找到使用此外键的实体,则忽略它,这实际上是数据一致性错误)。删除NotFound.Ignore并修复你的数据库。

答案 2 :(得分:0)

也许您在缓存提供程序的配置方面遇到了一些问题。我曾经想要你想要使用Couchbase作为二级缓存提供者,如下所述:

http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider

如果您的部署环境位于Azure上,我想这可能很有用。请注意,SysCache模块无法与AzureMemcached模块共存。

http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching