NHibernate 使用 SysCache 跨 session 缓存实体

标签 nhibernate second-level-cache

我正在开发一个 Web 应用程序,我希望缓存能够跨 Web 请求持续存在。
我知道一级缓存仅针对每个 session 。我启用了二级缓存,这适用于查询。

但是,二级缓存似乎不适用于“获取”实体……因此,应用程序所做的大部分 DB 工作并未跨 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 helper 上的方法,所以我正在尝试 Cache.Is(c => c.ReadWrite()) -- 流畅的界面有变化吗?

最佳答案

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

关于NHibernate 使用 SysCache 跨 session 缓存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925564/

相关文章:

java - 配置没有二级缓存的查询缓存

如果之前违反了唯一约束,NHibernate 将停止

c# - NHibernate SessionFactory 线程安全问题

c# - 使用 Fluent NHibernate 覆盖 C# 属性访问器方法的基本行为

Nhibernate 和 SetCacheable 与二级缓存

spring - 为什么我的实体没有从我的二级缓存中逐出?

c# - 哪一款性能更好?

c# - ninject 将 iunitofwork 注入(inject)存储库范围的属性

java - Hibernate 二级缓存 : Does get use it?