我对第一级和第二级缓存有疑问。
二级缓存
它与sessionFactory相关联。假设我们有两个会话 session1 和 session2 ,并且有一个表student
。我们从 session1 调用get()
,然后它将命中DB并将对象存储在 session1 和sessionFactory中。如果我们从 session2 调用get()
,则sessionFacory对象将复制到session2。如果以后我们调用get()
它将不会命中DB。它将从会话对象(第一级缓存)中获取它。
至此我很清楚。
之后,另一个名为 session3 的会话想要更新相同的记录,如果我们在 session1 和 session2 上调用get()
。会发生什么?
第一级缓存
它与会话相关联。如果我们有两个会话 session1 和 session2 。我们从 session1 调用get()
,它将命中DB并将对象存储在session1中。如果我们使用 session2 进行更新,如果我们下次从 session1 致电get()
会怎样?
我听说二级缓存有一些缺点。如果这是真的,他们是什么?
答案 0 :(得分:0)
你一次问三个问题。
<强> 1。问题强>
我不确定你的意思
session3想要更新相同的记录
会话没有自由意志。如果他们只是想要一些东西,几乎没有任何事情发生。但是,如果您使用第三个会话来更新已经缓存在 session1 和 session2 中的实体,他们将保留缓存(现在已过时)的版本。如果使用 session1 或 session2 更新同一实体,则更新将失败,并带有乐观锁定异常。
第二级缓存将使用 session3 存储的新版本进行更新。
<强> 2。问题强>
这与第一个场景相同: session1 现在有一个陈旧的对象,它将继续使用。
第3。问题(二级缓存的缺点)
各种缓存都有相同的挑战:
如果你把东西放进缓存中但又不需要它,你就会浪费CPU时间把它放在那里,并留下内存来保存它。
如果您查看缓存但找不到要查找的内容,则会浪费CPU时间查看。
如果您在更改后将内容保留在缓存中,您将使用陈旧数据。