本文来自动力节点课堂
链接:https://pan.baidu.com/s/1nRB8iPKc25yTx0JRXGcy-Q 密码:ws2w
1、缓存的分类:
- 事务范围的缓存
hibernate的一级缓存属于事务范围的缓存,是单session缓存。当事务结束的时候,缓存的生命周期也会结束。事务缓存是以内存作为缓存介质的。 - 应用范围的缓存
hibernate的二级缓存属于应用范围的缓存,是单SessionFactory缓存。它可以被应用范围内的所有事务访问,当应用结束的时候缓存生命周期结束。它是以内存或硬盘做为缓存介质 - 集群范围的缓存
是多SessionFactory缓存,在集群环境中,在一台或者多态机器的进程共享。
2、一级缓存
一级缓存不能被取消,是由hibernate管理的。
证明一级缓存存在的方案:
结果:控制台只会查询一次数据库,第二次从缓冲区读取
3、快照
概念:快照是数据库的副本,快照始终和数据库的数据保持一致。
3.1 快照的作用
说明:虽然没有调用update(),但是在提交之后数据库的数据还是修改了,通过比较堆中的数据和快照的数据是否一致来决定是否执行更新,这体现了快照的起了作用。
补充:快照的目的就是为了提高性能,因为快照的数据和数据库是保持一致的,所以我们可以提前比较快照的数据和要向数据更新的数据是否一致,这样可以避免向数据更新相同的数据,而快照是放在内存中的,这相比从数据库中获取数据效率是提高很多的。
3.2 刷新点和同步
Session的刷新点是指Session缓存中的数据更新,Session的同步是指Session的数据同步到DB。
Session刷新点有:
- 执行query()查询
- 执行session.flush()
- 执行事务的提交
Session同步点只有一个:事务的提交
ps:Session的刷新点可以修改,通过setFlushMode()来修改。
3.2.1 删除操作与刷新点
说明:数据库的数据没有被删除,因为没有提交事务,所以缓存中的数据更新不会同步到数据库
3.2.2 修改操作与刷新点
结论:只有到了刷新点才有可能执行update语句,如果修改的内容和快照的结果一致,这时候是不执行update操作的,否则执行,这点和“删除操作与刷新点”是不同的。
3.2.3 插入操作与刷新点
说明:不等到刷新点的到来,在执行save()方法就会执行insert,这点又是和删除、更新不一样的。
4、二级缓存
二级缓存被称为SessionFactory级的缓存,它的生命周期和应用的生命周期一致的。
SessionFactory缓存分为两种:内置和外置。
SessionFactory的内置缓存存放了映射元数据和预定义SQL语句,SessionFactory的外置缓存也被称为Hibernate的二级缓存。
二级缓存的数据一般为只读的,因为所有的session都共享一个SessionFactory,所以如果能修改的话会出现脏读的情况。
Hibernate只提供了二级缓存的规范,需要第三方的插件,例如Ehcache.
二级缓存和一级缓存的对象是不一样的
待续。。。。。。