当前位置: 首页 > 知识库问答 >
问题:

Hibernate一级缓存-是否同步?

单于骁
2023-03-14

我知道,会话是Hibernate使用的一级缓存,一旦我们从会话中检索到一个实体,对具有相同标识符的同一实体的后续get调用将从会话(而不是数据库)中提取,直到会话(打开)为止。

话虽如此,我对hibernate如何将一级缓存与DB同步表示怀疑?考虑以下场景

//Lets say I have created the session

Session s1 = sessionFactory.getSession();
User u1 = s1.get(User.class, 1); //Getting User with ID=1
//s1 is not yet closed

//Lets say I create some other session

Session s2 = sessionFactory.getSession();
User u2 = s2.get(User.class, 1); //Getting User with ID=1
u2.setName("Abc"); // Changed a field
s2.save(u2); // Saved the changes to DB
s2.close(); //Closed the 2nd session

//Now when I once again retrieve User with ID=1 from s1, will I get updated User?
User u3 = s1.get(User.class, 1);// Here as per my understanding cache is used

所以我的问题是

  • 由于u3是从1级缓存中获取的,u3是否有更新的值?
  • 如果有人在会话打开时直接更新DB并修改User对象,会话是否与DB同步?

提前感谢您的时间和精力在这个线程

共有3个答案

湛安宁
2023-03-14

第一级(会话级)缓存确保一个事务加载的持久实例的状态与其他事务所做的更改隔离。

因此,当您在第一个事务中调用s1.get(User.class,1)时,s2在不同事务(T2)中所做的更改是不可见的,因为这次Hibernate将从会话级缓存s1中获取User

公西嘉玉
2023-03-14

您需要使用u1作为参数在s1上调用Session.evict(Object)以获得新的查找。或者,对于这种情况,您也可以在s1上调用Session.clear()以获得相同的效果。您也可以调用Session.refresh(Object Object)来刷新u1的状态。

请注意,在提交事务后,其他客户机可能需要一段未定义的时间(通常不会很长)才能看到它们。使用不同连接的其他会话可能无法立即看到更新。

洪建茗
2023-03-14

不,除非您明确请求,否则Hibernate不会将会话缓存中实体的状态和DB同步。

通常这不是问题,因为活动工作通常发生在事务内部,事务内部的操作不应该看到其他并发事务所做的更改(但细节取决于隔离级别)。因此,在这种情况下,Hibernate的行为补充了事务隔离的典型语义学。

也可能存在需要显式同步实体状态以反映同一事务内所做更改的情况。这可能是由批量更新查询或执行数据库触发器引起的。在这种情况下,您需要通过调用<代码>刷新()显式请求这样的同步。

 类似资料:
  • 问题内容: 我知道一个事实,它是 Hibernate 使用的一级缓存,一旦我们从中检索到一个实体,便会从而不是从DB中获取具有 相同标识符 的 同一实体 的后续get调用,直到is Open 为止。 话虽如此,我对hibernate如何将第一级缓存与数据库同步感到怀疑吗?考虑以下情形 所以我的问题是 由于从一级缓存中获取,是否具有更新的值? 如果有人在会话打开时直接更新DB并修改User对象,是否

  • 问题内容: 我知道一个事实,它是 Hibernate 使用的一级缓存,一旦我们从中检索到一个实体,就会从而不是从DB中获取对具有 相同标识符 的 同一实体 的后续get调用,直到is Open 为止。 话虽如此,我对休眠如何将第一级缓存与数据库同步感到怀疑吗?考虑以下情形 所以我的问题是 由于是从一级缓存中提取的,因此有更新的值吗? 如果在会话打开时有人直接更新DB并修改User对象,那么是否与D

  • 问题内容: 在工作面试中,一名招聘人员问我“休眠状态中有多少个缓存级别?”。 所以我描述了1级和2级。 他说的是正确的,但也有一个三级缓存,例如,缓存某些不经常更改的表的结果,例如“ CURRENCY”或“ COUNTRY”,然后每隔“ 12/24 /您想要什么时间”重新加载这些表。 我搜索了一下,但是什么也没找到。那么,实际上是否存在第三级缓存还是仅仅是某种功能,如果是,该功能的名称是什么,我该

  • 主要内容:缓存,Hibernate 一级缓存,快照区Hibernate 是一款全自动 ORM 框架,它会在应用程序访问数据时,自动生成 SQL 语句并执行,因此开发人员不需要自己编写 SQL 语句,但这也造成它无法像 MyBatis 一样,能够直接从 SQL 层面严格控制其执行性能以及对数据库的访问频率,所以很容易出现性能不佳的情况。 为此,Hibernate 提供了多种性能优化手段(例如 HQL、懒加载策略、抓取策略以及缓存机制),其中缓存机制是

  • 问题内容: 我想在hibernate项目中使用二级缓存,但是我只对hibernate二级缓存了解一点,任何人都可以解释我应该如何在代码中使用它以及需要什么配置和.jar文件吗?我将这些设置设置为我的hibernate.cfg.xml文件 并添加这些jar文件, 我想知道我是否需要更改其他配置? 我怎么知道我的项目使用二级缓存? 如果只是设置此设置,hibernate将自动使用此设置,否则我必须在我

  • 本文向大家介绍请简述一下Hibernate的一级缓存、二级缓存以及查询缓存分别是什么?相关面试题,主要包含被问及请简述一下Hibernate的一级缓存、二级缓存以及查询缓存分别是什么?时的应答技巧和注意事项,需要的朋友参考一下 考察点:缓存 参考回答: Hibernate的Session提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会立即把这种