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对象里面的值
修改持久态对象的值
同时修改一级缓存中的内容
*/
// 修改一级缓存内容,但是不会修改一级缓存对应的快照区内容
/* 最后提交事务
提交事务时候,所做的事情:
比较
比较一级缓存内容和对应的快照区内容是否相同,如果不相同,把一级缓存内容更新到数据库里面
*/