Hibernate的缓存

Hibernate的一级缓存

  • 什么是缓存
1.数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
  • Hibernate缓存
1.hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

2.hibernate缓存特点:
第一类hibernate的一级缓存
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须		持久态数据

第二类hibernate的二级缓存
(1)目前以及不使用了,替代技术redis
(2)二级缓存使用范围,是SessionFactory范围

验证一级缓存存在

只在持久态中存在

1.验证方式
(1)首先根据uid=1查询,发送sql语句查询数据库,返回对象
(2)其次再根据uid=1查询,没有发送sql语句,查询一级缓存内容
// 第一次执行查询uid=6的User对象
User user1 = session.get(User.class, 6);
System.out.println(user1);
// 第二次查询uid=6的User对象
User user2 = session.get(User.class, 6);
System.out.println(user2);

一级缓存执行过程

第一次get的时候:
首先,查询一级缓存中是否有该数据,发现一级缓存中没有数据,才会执行sql语句查询数据,返回user1对象

第二次get的时候:
查询一级缓存中是否有该数据,发现一级缓存中有相同数据,直接返回user2

一级缓存中存储的不是对象,而是对象的值**,当执行第二次相同get时,会将一级缓存中的数据拼成一个
新的对象user2

一级缓存特性(快照区)

1.持久态自动更新数据库
// 1根据uid查询
User user = session.get(User.class, 7);
// 2设置返回对象值
user.setUsername(roots);
// 3调用update方法
//session.update(user);

2.执行过程
生成一级缓存的同时会生成快照区(副本)

// 当执行根据uid查询时
User user = session.get(User.class, 7);
// 会将返回的user持久态对象放到一级缓存中
// 同时会把user对象放到一级缓存对应的快照区里面

// 执行设置返回对象值
user.setUsername(roots);
// 把user对象放到一级缓存对应的快照区里面,副本区里面的不变
// 查询的时候存储到一级缓存中的是,数据库中的值,当执行第二步时,因为修改了user对象的username属性
// 所以,当前一级缓存中的数据就变化了,但是快照中的不会变

/*	这一段滤过,不必在意
	修改user对象里面的值
	修改持久态对象的值
	同时修改一级缓存中的内容
*/

// 修改一级缓存内容,但是不会修改一级缓存对应的快照区内容

/* 	最后提交事务
	提交事务时候,所做的事情:
	比较
	比较一级缓存内容和对应的快照区内容是否相同,如果不相同,把一级缓存内容更新到数据库里面
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值