我正在运行NHibernate Profiler,我无法理解为什么从二级缓存中检索某些实体而有些实体不是。
我已经设置了所有必要的东西 - 启用了二级缓存(SysCache2),并且对于给我提出问题的实体,缓存设置为ReadOnly。我到处都在使用交易。
首先,我的实体看起来像这样:
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中,员工被加载,然后在他当前的办公室引起急切的选择。正确使用二级缓存,因为办公室缓存在会话#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
为什么会话#3中的最后一个SQL语句出现 - 为什么没有使用二级缓存,就像在Session#2中一样?
答案 0 :(得分:3)
我已经解决了这个问题。
在代码库中,正在调用使用Session.CreateSqlQuery()。ExecuteUpdate()。
但是,它正在执行的查询没有指定实体。当发生这种情况时,似乎NHibernate决定清除所有缓存区域,消灭整个缓存!
故事的道德,不要使用Session.CreateSqlQuery()。ExecuteUpdate()而不指定实体。