为什么二级缓存没有用于特定实体?

时间:2011-06-01 08:48:52

标签: nhibernate

我正在运行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中一样?

1 个答案:

答案 0 :(得分:3)

我已经解决了这个问题。

在代码库中,正在调用使用Session.CreateSqlQuery()。ExecuteUpdate()。

但是,它正在执行的查询没有指定实体。当发生这种情况时,似乎NHibernate决定清除所有缓存区域,消灭整个缓存!

故事的道德,不要使用Session.CreateSqlQuery()。ExecuteUpdate()而不指定实体。