gpt4 book ai didi

nhibernate - 为什么二级缓存不用于特定实体?

转载 作者:行者123 更新时间:2023-12-04 00:44:00 26 4
gpt4 key购买 nike

我正在运行 NHibernate Profiler,但我无法弄清楚为什么有些实体会从二级缓存中检索出来,有些则不会。

我已经设置了所有必要的东西 - 二级缓存已启用 (SysCache2),并且对于给我带来问题的实体,缓存设置为 ReadOnly。我到处都在使用交易。

首先,我的实体看起来像这样:

Employee { Id, Name, CurrentOffice }

Office { Id, Name }

Team { Id, Name, Office }

其次,这里有一些来自 NH 分析器的例子来证明这个问题:

session #1

配置文件显示以下 SQL 调用。这是由 Session.Get() 调用生成的:

SELECT office_.Id, office_.Name FROM Officeoffice_ WHERE office_.Id = 5

session #2

在 session 2 中,加载了一名员工,然后导致对他当前办公室的急切选择。二级缓存被正确使用,因为办公室被缓存在 session #1 中:

SELECT employee.Id, employee_.Name, employee_.CurrentOfficeId FROM Employeeemployee_ WHERE employee_.Id = 1

2nd level cache load Office (5 /* id*/)

第 3 节

接下来加载一些 Teams,这会导致在其关联的 office 上进行急切选择。但是现在二级缓存没有用于我们应该在上一个 session 中缓存的办公室。

SELECT team_.Id, team_.Name, team_.OfficeId FROM Team team_ WHERE team_.Id in (7,8,9)

SELECT office_.Id, office_.Name FROM Officeoffice_ WHERE office_.Id = 5

为什么会出现 Session #3 中的最后一个 SQL 语句 - 为什么没有使用二级缓存,就像在 Session #2 中一样?

最佳答案

我已经解决了这个问题。

在代码库中进行了一个使用 Session.CreateSqlQuery().ExecuteUpdate() 的调用。

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

故事的寓意,不要在未指定实体的情况下使用 Session.CreateSqlQuery().ExecuteUpdate()。

关于nhibernate - 为什么二级缓存不用于特定实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6198517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com