Hibernate缓存
1. 不使用缓存
<1>使用同一个session执行查询 对同个对象的第二次查询只是返回第一册查询结果 而不是重新使用SQL语句对数据库进行查询
2. 一级缓存(Session缓存)
- 介绍
- 通过Session从数据库查询实体会把实体在内存中存储起来,下一次查询同一实体不再从数据库获取,而是从内存中获取
- 一级缓存的生命周期和Session相同
- API
一级缓存无法取消,用两个方法管理
<1> evict(): 用于将某个对象从Session的一级缓存中清除
<2> clear(): 用于将一级缓存中所有对象全部清除 - 问题
<1> query.list()不会使用到缓存
<2> query.iterate() 执行流程是 查询对象的ID 然后根据Id到缓存中找 没有找到 自己到数据库中找
3. 二级缓存
- 介绍
每个Session共享缓存,不是默认开启 - 配置步骤
<1>JAR导入
<2>SRC -> ehcache.xml
<3>hibernate.cfg.cml 配置二级缓存入口(指定二级缓存的外部实现类)
<4>在对应实体类的配置文件中开启二级缓存 - <4>
事务模式 只读
<cache usage="read-only" include="all或者non-lazy" region="任意名"
non-lazy 当本表关联其他表的属性时 不设置那个属性
region对应的value可以在ehcache.xml中对应标签 设置他的缓存策略(最大缓存数量,缓存对象永久)
4. 二级缓存 & 一级缓存
- 试用情况
<1>很少被修改的数据
<2>不是很重要的数据,允许出现偶尔并发的数据
属性 | 一级缓存 | 二级缓存
---|--- | ---
缓存的范围|事务范围 每个事务都拥有单独一级缓存|应用范围,当前应用内所有事务共享
并发访问策略|不会出现并发问题|必须提供适当的并发访问策略
数据过期策略|没有数据过期策略|缓存对象的最大数目、最长时间、最长空闲时间等
缓存的软件实现|框架包含|第三方提供、可插拔集成
物理介质|内存|内存和硬盘
启用方式|默认启用、不可关闭|默认不启用、选择性开启
5. 缓存算法
LRU Least Recently Used
LFU Least Frequently Used
FIFO First In First Out