0

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

  • 开始循环
  • 修改周期
  • 结束循环
  • 循环

等等

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

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

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

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

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

那么你能建议我用 NHibernate 做什么来将 Cycles 表的所有内容存储在缓存中(哦,我也没有提到该表中的数据数量很小:每月 1 个周期,所以目前大约 20 行,并且每月会增长 1 行)并最小化向Cycles表发出的查询?

4

1 回答 1

2

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

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

于 2012-09-13T17:14:37.607 回答