如何解决为什么二级缓存不用于特定实体?
| 我正在运行NHibernate Profiler,我无法弄清为什么某些实体是从二级缓存中检索的,而有些则不是。 我已经设置了所有必要的操作-启用了第二级缓存(SysCache2),并且对于给我带来问题的实体,将缓存设置为ReadOnly。我到处都在使用交易。 首先,我的实体看起来像这样:Employee { Id,Name,CurrentOffice }
Office { Id,Name }
Team { Id,Office }
其次,这是NH Profiler中的一些示例来演示该问题:
第一场
该配置文件显示以下SQL调用。这是通过Session.Get()调用生成的:
从办公室中选择office_.Id,office_.Name
office_ WHERE office_.Id = 5
第二场
在会话2中,将加载一名员工,这将导致其当前办公室的急切选择。二级缓存已正确使用,因为办公室已在会话#1中缓存:
从雇员中选择employee.Id,employee_.Name,employee_.CurrentOfficeId
employee_ WHERE employee_.Id = 1
2级缓存加载Office(5 / * id
* /)
第三场
接下来,将加载一些团队,这会导致在其关联办公室中进行渴望的选择。但是现在我们不应该在上一个会话中缓存的办公室使用二级缓存。
在(7,8,9)中从团队team_中选择team_.Id,team_.Name,team_.OfficeId
从办公室中选择office_.Id,office_.Name
office_ WHERE office_.Id = 5
为什么在会话#3中出现最后一个SQL语句-为什么不使用会话2中的二级缓存?
解决方法
我已经解决了。
在代码库中,进行了一个使用Session.CreateSqlQuery()。ExecuteUpdate()的调用。
但是,它正在执行的查询没有指定实体。发生这种情况时,NHibernate似乎决定清除所有缓存区域,从而清除整个缓存!
故事的寓意,不要在未指定实体的情况下使用Session.CreateSqlQuery()。ExecuteUpdate()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。