1. 缓存的范围
- a. 事务范围(一级缓存)
- i. 只能被当前事务访问
- ii. 生命周期依赖于事务生命周期
- iii. 缓存介质是内存
- b. 进程范围(二级缓存)
- i. 进程范围内所有事务共享 i. 进程范围内所有事务共享
- ii. 依赖于进程生命周期i. 依赖于进程生命周期
- iii. 物理介质可以为内存或硬盘 iii. 物理介质可以为内存或硬盘
- c.集群范围(二级缓存)
- i. 被一个或多个机器的进程共享
- ii. 进程间通过远程通信保证数据的一致性
2.Java对象在Hibernate持久化层中的状态
- a. 临时状态 new
- b. 持久化状态 save()、persist(Hibernate 3)
- c. 删除状态
- d. 游离状态
- i. update():把游离对象加入Session缓存 i. update():把游离对象加入Session缓存
- ii. merge():把游离对象的属性复制到持久化对象中ii. merge():把游离对象的属性复制到持久化对象中
- e. get()和load(),都只通过主键查询
- i. Get()采用立即检索策略,立即执行语句i. Get()采用立即检索策略,立即执行语句
- 目的为了访问对象的各个属性
- 无返回结果时使用结果抛NullPointerException
- ii. Load()方法采用延迟检索策略,不立即执行语句,
- 仅返回实体类的代理类实例,只保存实体对象的id值,占用内存少
- 使用到对象的其他属性时,才执行查询
3)目的是为了删除或建立和别的对象的联系 - 无返回结果时使用结果抛ObjectNotFoundException
- i. Get()采用立即检索策略,立即执行语句i. Get()采用立即检索策略,立即执行语句
- f.saveOrUpdate()
- g. delete()
- h. close()
3. 一级缓存
- a. Session缓存
- b. 内置的
- c. 不能被卸除的
- d. 一般由Hibernate自动维护的
4. Session缓存(一级缓存)清理缓存
- a. 缓存中对象属性发生变化时,Session不会立即清理缓存执行语句,而是在特定的时间点才清理
- b. 这让Session可以将几条相关的sql语句合并为一条语句,减少访问数据库的次数
- c. 清理缓存时间点
- i.调用Transection的commit()方法
- ii. 执行查询操作时,持久化对象的属性已发生变化,为保证数据一致性
- iii. 显示调用Session的flush()方法
5. 二级缓存(SessionFactory的缓存)
6.查询缓存
- a. 支持条件查询(一级二级都不支持)
- b. 依赖二级缓存
- c. 特定条件下发挥作用
- i. 完全相同的HQL重复执行
- ii.重复执行期间,Query Cache对应的数据表不能有数据变动(添加、删除、修改)
- iii. 绝大多数查询并不能从查询缓存中受益,所以Hibernate默认不进行查询缓存。
7. 通过时间戳判断查询结果是否过期
- a. 第一刻,执行查询语句,结果放入缓存,记时间戳为t1
- b. 第二刻,对已查询的相关表进行插入更新删除操作,记时间戳为t2
- c.第三刻,执行查询语句,对比QueryCache区域时间戳和时间戳缓存区域,若t2>t1,则查询缓存失效