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

参考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*来修改持久态的值和一级缓存中的内容,但是不会修改快照区的内容,提交事务时进行比较,比较一级缓存区的内容和快照区的内容是否相同,不相同就把一级缓存中的内容更新到数据库,相同就不进行操作。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值