NHibernate的缓存选项

时间:2012-09-13 16:03:02

标签: hibernate nhibernate nhibernate-mapping hibernate-mapping

在应用程序中,我有一个名为 Cycles 的参考表,它被映射到循环实体。基本上大多数使用NHibernate实体映射都会保留对该表的引用。通常这些实体具有以下字段:

  • StartCycle
  • ModificationCycle
  • EndCycle
  • 循环

等。

即使我按请求使用会话,我仍然在日志中看到大多数查询都发布到 Cycles 表。当我不是通过Cycle ID查询,而是通过属于 Cycle 类型的其他属性时,就是这种情况。

循环类型几乎是不可变的,它具有 Status 属性,实际上这是Service类可以更改的唯一属性(如CloseCycleService,Open等)。 )。 此外,无法删除循环,但可以插入循环。

所以我想尽量减少对 Cycles 表的查询次数。

我可以通过使用应用程序缓存将其缓存在ASP .NET中,并创建另一层抽象,但在我这样做之前,我想知道NHibernate给出的选项有什么缺点?

我看到的唯一问题是多线程 - 即使 Cycle 几乎是不可变的(并且是无状态的),可能会发生两个请求同时尝试修改同一个实体并且它可能导致错误。但是......这几乎是不可能的。

那么你可以建议我如何处理NHibernate将所有Cycles表的内容存储在缓存中(哦,我也没有提到该表中的数据量很小:每月1个周期,所以目前它是大约20个,每月增长1个,并尽量减少发给 Cycles 表的查询?

1 个答案:

答案 0 :(得分:2)

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

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