0

在应用程序中我有一个名为循环的参考表映射到循环实体。基本上NHibernate实体映射的大部分都保持对该表的引用。通常,这些实体有这样的字段:NHibernate的缓存选项

  • StartCycle
  • ModificationCycle
  • EndCycle
  • 周期

即使我用每个请求会话我仍然看到在日志大部分查询发布到周期表。当我不是通过循环ID查询,而是通过属于循环类型的其他属性时,就是这种情况。

周期类型几乎是一成不变的,它有状态属性,其实这是一个可以由服务类被改变(如CloseCycleService,开放等)的唯一属性。 另外Cycle不能被删除,但可以插入。

所以我想尽量减少查询次数到周期表。

我可以通过使用应用程序缓存将其缓存在ASP .NET中,并创建另一个抽象层,但在此之前,我想知道NHibernate提供了哪些选项以及哪些是缺点?

我看到的唯一问题是多线程 - 即使周期几乎是不可变的(和无状态的),它可能发生两个请求试图同时修改同一个实体并可能导致错误。但是......这几乎是不可能的。所以,你可以建议我可以用NHibernate做什么来将Cycles表的所有内容存储在缓存中(哦,我也没有提到该表中的数据数量很小:每个月有一个周期,所以目前它大约20行,并且每月增长1行)并且最小化发布到周期表的查询?

回答

2

对SysCacheProvider和查询缓存使用NHibernate二级缓存 - 当您为Cycle实体创建一个查询时,调用.SetCacheable(true)将查询结果存储在缓存中(以及实体本身)

NHibernate的二级缓存实现得非常好,并将保持缓存与您在同一进程中所做的任何更改保持一致。如果您直接在数据库中进行更改,那么您可以查看我相信也支持SqlDependencies的SysCacheProvider2(我认为)。