【发布时间】:2011-10-01 18:59:29
【问题描述】:
有没有办法告诉 NHibernate (2.0) 整个表必须始终保存在二级缓存中?或者有没有办法拦截缓存未命中,或者当 NHibernate 尝试加载单个实体并将该查询重定向以加载整个表时?
【问题讨论】:
标签: .net nhibernate caching
有没有办法告诉 NHibernate (2.0) 整个表必须始终保存在二级缓存中?或者有没有办法拦截缓存未命中,或者当 NHibernate 尝试加载单个实体并将该查询重定向以加载整个表时?
【问题讨论】:
标签: .net nhibernate caching
你看到另一个post on S.O了吗?好的,它的休眠状态,但我怀疑您可以将相同的原则应用于 NHibernate。
我们最终通过存储 记住所有的主键 我们需要的表中的实体 加载(因为它们是模板数据 并且没有新模板 添加/删除)。
然后我们可以使用这个主要的列表 查找每个实体的键和 利用 Hibernates 1 级和 2 级 缓存。
【讨论】:
最简单的方法是在该实体上启用二级缓存,并在应用程序启动时执行将加载所有实体的查询。
它不保证它会一直存在(缓存可以出于多种原因被刷新/删除),但它可能对你来说已经足够了。
或者-您可以通过使用 System.Cache 自己实现这样的事情
【讨论】:
我们需要创建一个自定义的 Get 函数而不是 session.Get()。首先获取一个 IEntityPersister:session.GetSessionImplementation().GetEntityPersister(new T())。丑陋,因为 Type 参数没有重载,但是可以工作。然后我们可以获取缓存,并检查实体是否在缓存中。如果不是,则从数据库中加载所有元素。这样,当使用这个自定义的 Get 函数时,NHibernate 将永远不会一个一个地加载实体,而是一次全部加载,它会缓存它们,直到它过期,然后以同样的方式再次加载它们。
【讨论】: