hibernate的一级缓存概述与执行过程的演示
程序员文章站
2022-03-15 13:11:42
...
参考https://blog.csdn.net/BushQiang/article/details/79830219
hibernate自带一级缓存特性,那么什么是一级缓存哪。
就拿更新操作而言,下面是示例代码。
//修改操作
@Test
public void testUpdate() {
//加载配置文件
Configuration cfg = new Configuration();
cfg.configure();//开始布局
//获取sessionFactory对象
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();//开始连接
//开启事务
Transaction tra = session.beginTransaction();
//获取数据
User user = session.get(User.class, 5);
user.setUaddress("Beijing");
session.update(user);
User user1 = session.get(User.class, 5);
user1.setUaddress("天津");
session.update(user1);
//提交事务
tra.commit();
session.close();
sessionFactory.close();
}
上面是两个更新操作,现实中上述的场景是应用在多线程共同通过session进行操作时遇到的情况,但是多线程不容易展示,所以我将过程简化成上面的情况。
我们在第一次获取id为5的实体类处打断点。
现象总结:
session的get方法在第一次查询id为5时立即就执行了sql语句,并进行了更改数据,但是在第二次要根据id为5进行查询时,却没有触发sql语句。
现象解释:
因为我们前一次已经查询过id为5的实体类。此时的实体类放在缓存中,当第二次根据id进行查询时,它先向缓存中查询 是否存在相应的实体类,发现存在 就不再触发sql语句了。这就是一级缓存的概念与执行过程。
hibernate以及缓存执行过程
Hibernate一级缓存特性: 持久态自动更新数据库
不需要用session的update方法就可以对数据库进行更新了。
持久态自动更新的过程:
在创建session的时候会出现一个一级缓存,同时也会产生一个快照区(副本),执行session.get方法时先在一级缓存区找有没有这个数据如果没有就去数据库查询,然后把持久态对象放到一级缓存和快照区,然后通过set*来修改持久态的值和一级缓存中的内容,但是不会修改快照区的内容,提交事务时进行比较,比较一级缓存区的内容和快照区的内容是否相同,不相同就把一级缓存中的内容更新到数据库,相同就不进行操作。