如果我们有多个会话对象,第一级缓存如何工作?

时间:2015-05-08 19:07:02

标签: java hibernate

我对第一级和第二级缓存有疑问。

二级缓存

它与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()会怎样?

我听说二级缓存有一些缺点。如果这是真的,他们是什么?

1 个答案:

答案 0 :(得分:0)

你一次问三个问题。

<强> 1。问题

我不确定你的意思

  

session3想要更新相同的记录

会话没有自由意志。如果他们只是想要一些东西,几乎没有任何事情发生。但是,如果您使用第三个会话来更新已经缓存在 session1 session2 中的实体,他们将保留缓存(现在已过时)的版本。如果使用 session1 session2 更新同一实体,则更新将失败,并带有乐观锁定异常。

第二级缓存将使用 session3 存储的新版本进行更新。

<强> 2。问题

这与第一个场景相同: session1 现在有一个陈旧的对象,它将继续使用。

第3。问题(二级缓存的缺点)

各种缓存都有相同的挑战:

  1. 如果你把东西放进缓存中但又不需要它,你就会浪费CPU时间把它放在那里,并留下内存来保存它。

  2. 如果您查看缓存但找不到要查找的内容,则会浪费CPU时间查看。

  3. 如果您在更改后将内容保留在缓存中,您将使用陈旧数据。