【发布时间】:2011-06-01 08:48:52
【问题描述】:
我正在运行 NHibernate Profiler,但我无法弄清楚为什么有些实体正在从二级缓存中检索而有些却没有。
我已经设置了所有必要的东西 - 二级缓存已启用 (SysCache2),对于给我带来问题的实体,缓存设置为只读。我到处都在使用事务。
首先,我的实体如下所示:
Employee { Id, Name, CurrentOffice }
Office { Id, Name }
Team { Id, Name, Office }
其次,这里有一些来自 NH 分析器的示例来演示该问题:
会话 #1
配置文件显示以下 SQL 调用。这是由 Session.Get() 调用生成的:
SELECT office_.Id, office_.Name FROM Office office_WHERE office_.Id = 5
第 2 场会议
在会话 2 中,加载了一名员工,然后在他当前的办公室中引发了一个急切的选择。二级缓存使用正确,因为办公室在 Session #1 中被缓存:
SELECT employee.Id、employee_.Name、employee_.CurrentOfficeId FROM Employee employee_WHERE employee_.Id = 1
二级缓存加载 Office (5 /* id */)
第 3 场会议
接下来会加载一些团队,这会导致在其关联的办公室上进行急切的选择。但是现在二级缓存没有用于我们应该在上一个会话中缓存的办公室。
SELECT team_.Id, team_.Name, team_.OfficeId FROM Team team_ WHERE team_.Id in (7,8,9)
SELECT office_.Id, office_.Name FROM Office office_WHERE office_.Id = 5
为什么会出现 Session #3 中的最后一条 SQL 语句 - 为什么没有使用 2 级缓存,就像在 Session #2 中一样?
【问题讨论】:
-
您能否提供用于实体的映射?由于缓存过期或内存不足,Office 是否可能在您的第三次会话之前从缓存中删除?此外,NHibernate 的版本可能有助于重现问题。
-
嗨,谢谢,这是在我的本地计算机上运行的,所以有足够的内存。我正在使用 NH 2.1。缓存过期设置为 20 分钟 - 我已经在 NHibernate 的日志中验证了这一点。映射是使用 Fluent NHibernate 完成的,它们没有什么特别之处。映射包括对 Cache.ReadOnly 或 Cache.NonStrictWrite 的调用。
标签: nhibernate