欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的实体类处打断点。
hibernate的一级缓存概述与执行过程的演示
现象总结:
session的get方法在第一次查询id为5时立即就执行了sql语句,并进行了更改数据,但是在第二次要根据id为5进行查询时,却没有触发sql语句。

现象解释:
因为我们前一次已经查询过id为5的实体类。此时的实体类放在缓存中,当第二次根据id进行查询时,它先向缓存中查询 是否存在相应的实体类,发现存在 就不再触发sql语句了。这就是一级缓存的概念与执行过程。

hibernate以及缓存执行过程
hibernate的一级缓存概述与执行过程的演示

Hibernate一级缓存特性: 持久态自动更新数据库
hibernate的一级缓存概述与执行过程的演示

不需要用session的update方法就可以对数据库进行更新了。

持久态自动更新的过程:

在创建session的时候会出现一个一级缓存,同时也会产生一个快照区(副本),执行session.get方法时先在一级缓存区找有没有这个数据如果没有就去数据库查询,然后把持久态对象放到一级缓存和快照区,然后通过set*来修改持久态的值和一级缓存中的内容,但是不会修改快照区的内容,提交事务时进行比较,比较一级缓存区的内容和快照区的内容是否相同,不相同就把一级缓存中的内容更新到数据库,相同就不进行操作。
hibernate的一级缓存概述与执行过程的演示