首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NHibernate跨会话的SysCache缓存实体

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

Stack Overflow用户
提问于 2010-10-13 15:53:18
回答 3查看 1.6K关注 0票数 8

我正在开发一个web应用程序,我希望缓存能够在整个web请求中持久存在。我知道第一级缓存仅限于每个会话。我启用了二级缓存,这可以用于查询。

然而,第二级缓存似乎不适用于“获取”实体.因此,应用程序所做的大部分DB工作都不是跨web请求缓存的。

这是正常/可取的行为吗?我正在查看一个特定的页面,该页面对数据库进行了多次往返,尽管每个查询都是快速的,但如果实体可以缓存,这些查询似乎就没有必要了。

编辑

好的,我已经启用了二级缓存,并且可以处理查询。我只是不能让它对实体有效。我正在测试的主实体上有Cache.Is(c => c.ReadWrite()) (fluent nhibernate)。但是没有,每次都会碰到DB。有什么想法吗?

编辑

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

代码语言:javascript
复制
public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
        var accomm = Session.Get<Accommodation>(id); 
        tx.Commit(); 
        return accomm; 
    } 
} 

我的映射是这样的(您可以看到我们有一个讨厌的模式):

代码语言:javascript
复制
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()) -- fluent界面改变了吗?

EN

回答 3

Stack Overflow用户

发布于 2010-10-13 17:20:01

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

票数 4
EN

Stack Overflow用户

发布于 2011-05-18 11:33:03

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

票数 0
EN

Stack Overflow用户

发布于 2014-04-14 12:46:52

也许您对缓存提供程序的配置有一些问题。我一直希望您能够使用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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3925564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档