【问题标题】:NHibernate caching entities across sessions using SysCacheNHibernate 使用 SysCache 跨会话缓存实体
【发布时间】:2011-04-24 22:39:44
【问题描述】:

我正在开发一个 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 helper 上看到Is 方法,所以我正在尝试Cache.Is(c =&gt; c.ReadWrite()) -- 流畅的界面是否改变了?

【问题讨论】:

  • 最简单的方法是将您的 NHibernate 会话保存在 Web 会话中,但我不建议这样做:P 您可能应该修复您的二级缓存 - 您是否阅读过这篇文章:blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/…
  • 链接+1,但请查看我的编辑
  • 您使用的是哪个提供商?如果使用 memcached 在获取之前手动检查实体是否实际存在。

标签: nhibernate second-level-cache


【解决方案1】:

也许您的缓存提供程序的配置有问题。如此处所述,我已经能够做到希望您使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 一切顺利,除非您使用无法完全控制数据的旧数据库。
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多