- 一级缓存
hibernate 在应用层维护一个可重复读的持久上下文
在使用主键加载实体的时候,hibernate 首先在持久上下文中根据主键查询实体,如果存在则返回,不存在则请求数据库
在使用非主键加载实体的时候,hibernate 请求数据库,首先从结果集中解析出实体的主键,然后在持久上下文中根据主键查询实体,如果存在则返回,不存在则继续解析剩余部分
1. 例子
1.1. findById
1 2 3 4 5 6 7 8
@Test @Transactional void l1CacheTest() { // query employeeRepository.findById(10001); 1 // no query employeeRepository.findById(10001); 2 }
1 第一次执行 SQL 2 第二次不执行 SQL 1.2. not findById
1 2 3 4 5 6 7 8 9 10 11 12 13
@Override @Transactional(isolation = Isolation.READ_UNCOMMITTED) 1 public void readUncommitted() { Optional<User> firstReadUser = userRepository.findFirstByUsername("admin"); String firstReadPassword = firstReadUser.map(User::getPassword).get(); 2 log.info("first read user admin password is {}", firstReadPassword); // debug point below // entityManager.clear(); 3 Optional<User> secondReadUser = userRepository.findFirstByUsername("admin"); 2 String secondReadPassword = secondReadUser.map(User::getPassword).get(); log.info("second read user admin password is {}", secondReadPassword); assertNotEquals(firstReadPassword, secondReadPassword); 4 }
1 设置事务隔离级别为可重复读 2 两次都执行 SQL 3 在第一次查询后开启另一个事务,修改数据 4 断言失败 参考文献
[spring-boot-isolation-level-read-uncommitted-not-working] https://stackoverflow.com/questions/67443569/spring-boot-isolation-level-read-uncommitted-not-working
[use-of-hibernate-first-level-cache] https://stackoverflow.com/questions/39482861/use-of-hibernate-first-level-cache
[Hibernate_User_Guide] https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#architecture-overview
星期四, 一月 20, 2022
Hibernate 一级缓存
订阅:
博文评论
(
Atom
)
没有评论 :
发表评论