NHibernate使用SysCache跨会话缓存实体

NHibernate使用SysCache跨会话缓存实体,nhibernate,second-level-cache,Nhibernate,Second Level Cache,我正在开发一个web应用程序,我希望缓存能够跨web请求持久化。 我知道第一级缓存仅针对每个会话。我启用了二级缓存,这对查询有效 但是,第二级缓存似乎不适用于“获取”实体。。。因此,应用程序所做的大部分数据库工作都不会跨web请求进行缓存 这是正常/可取的行为吗?我正在查看一个特定的页面,该页面对数据库进行了大量的往返访问,尽管每个查询都很快,但如果可以缓存实体,则这些查询似乎是不必要的 编辑 好的,我启用了二级缓存,并处理查询。我就是不能让它为实体工作。我正在测试的主实体上有Cache.Is(

我正在开发一个web应用程序,我希望缓存能够跨web请求持久化。 我知道第一级缓存仅针对每个会话。我启用了二级缓存,这对查询有效

但是,第二级缓存似乎不适用于“获取”实体。。。因此,应用程序所做的大部分数据库工作都不会跨web请求进行缓存

这是正常/可取的行为吗?我正在查看一个特定的页面,该页面对数据库进行了大量的往返访问,尽管每个查询都很快,但如果可以缓存实体,则这些查询似乎是不必要的

编辑

好的,我启用了二级缓存,并处理查询。我就是不能让它为实体工作。我正在测试的主实体上有
Cache.Is(c=>c.ReadWrite())
(fluent nhibernate)。但是没有,每次都会击中数据库。有什么想法吗

编辑

我尝试过使用这样的事务:

public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
        var accomm = Session.Get<Accommodation>(id); 
        tx.Commit(); 
        return accomm; 
    } 
} 
public(int-id)
{ 
使用(var tx=Session.BeginTransaction())
{ 
var accomm=会话.Get(id);
tx.Commit();
返回accomm;
} 
} 
我的映射是这样的(您可以看到我们有一个糟糕的模式):

public void覆盖(自动映射)
{
mapping.HasManyToMany(x=>x.Features).Table(“调节链接功能类型”).ChildKeyColumn(“功能类型ID”).NotFound.Ignore();
mapping.HasManyToMany(x=>x.SimilarAccountation).Table(“AccountationLink SimilarAccountation”).ChildKeyColumn(“SimilarAccountationId”).NotFound.Ignore();
mapping.HasMany(x=>x.TourItinerary).Table(“调节调节调节器”);
mapping.HasOne(x=>x.Images).ForeignKey(“调节ID”).Cascade.All().Not.LazyLoad();
mapping.References(x=>x.CollectionType).NotFound.Ignore().Not.LazyLoad();
mapping.References(x=>x.conditionUnitType).NotFound.Ignore().Not.LazyLoad();
Is(c=>c.ReadWrite());
}
但是,这似乎仍然无法从二级缓存中获取


顺便说一句,我在网上看到了很多使用
Cache.ReadWrite()
的例子,但我只能在Cache助手上看到
Is
方法,所以我正在尝试
Cache.Is(c=>c.ReadWrite())
——fluent界面是否已更改?

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

我也遇到了同样的问题。
在我的例子中,原因是引用映射为NotFound().Ignore()(即如果没有找到具有此外键的实体,请忽略它,这实际上是一个数据一致性错误)。删除NotFound。忽略并修复数据库。

可能您的缓存提供程序的配置有问题。我已经能够使用Couchbase作为二级缓存提供程序来满足您的需求,如下所述:

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


最简单的方法是将您的NHibernate会话保存在web会话中,但我不建议您这样做:p您可能应该修复您的二级缓存-您是否阅读过此帖子:?+1获取链接,但请参阅我的编辑您使用的是哪一个提供商?如果使用memcached,请在获取之前手动检查实体是否确实存在。谢谢,我刚刚也发现了这一点。除非您使用的是旧式数据库,而您无法完全控制该数据库的数据,否则请查看“一切正常”。
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());
}