1.缓存概念
- 并不是指计算机的CPU一二级缓存或者内存
- 缓存是指为了降低应用程序访问物理数据源的频次,从而提高应用程序性能的一种策略
2.为什么要使用缓存?
- ORM框架访问数据库的效率直接影响应用程序性能,
- 通过使用缓存,优化ORM框架的执行效率显得尤为重要。
3.缓存的一般工作原理
- 应用程序-->缓存8
- 命中:返回结果到应用程序中
- 未命中:向数据库查询数据并添加到缓存中-->返回结果到应用程序
4.一级缓存
- 一级缓存,也被称为"Session缓存","会话级缓存"
- 一级缓存生命周期和Session相同,当Session销毁时,一级缓存也销毁
- 一级缓存的作用范围为当前会话
- 第二次查询同一个对象时不会再进行数据库查询,而是从缓存中取出
- 在不同session中多次查询同一个对象时,会执行多次查询
- 一级缓存中,持久化类对象的每个实例都具有唯一的OID
默认开启一级缓存,使用以下两个方法管理
- evict():将某个对象从一级缓存中清除。
- clear():将一级缓存中所有对象清除。
4.二级缓存
1)添加对应jar包
2)在配置文件中添加Provider类的描述
- hibernate 3.3配置二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
- hibernate 4.0以后配置
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
3)添加二级缓存的属性配置文件
<
cache
name:cache唯一标识
eternal:缓存是否永久有效
maxElementsInMemory:内存中最大缓存对象数
overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中
diskPersistent:硬盘持久化
timeToIdleSeconds:缓存清除时间
timeToLiveSeconds:缓存存活时间
memoryStoreEvictionPolicy:缓存清空策略
1.FIFO:first in first out 先讲先出
2.LFU: Less Frequently Used 一直以来最少被使用的
3.LRU:Least Recently Used 最近最少使用的
/>
4.在被需要缓存的表对应映射文件中添加<cache/>标签
usage:指定缓存策略(transactional,read-write,nonstrict-read-write,read-only)
include:指定是否魂村延迟加载的对象(all表示缓存所有对象)
region:指定二级缓存区域名
non-lazy:表示不存延迟加载的对象
5)哪些情况可以使用二级缓存
- 修改频次少的数据
- 不是很重要的数据(允许偶尔出现并发的数据)
- 不会被高并发访问的数据
- 参考性数据
5.区别
- 一二级缓存的对比
缓存范围
- 事务范围,每个事务都有单独的一级缓存。
- 应用范围,当前应用下所有事务共享缓存
并发访问策略
- 没有并发访问策略
- 必须提供适当并发访问策略
数据过期策略
- 没有数据过期侧罗
- 缓存对象的最大数目,最长时间,最长空闲时间。
缓存的软件实现
- 框架自带
- 第三方,插拔集成
物理介质
- 内存
- 内存和硬盘
启用方式
- 默认启动,不可关闭。
- 默认不启动,选择性开启。
- query.list()和query.iterate()区别
1.返回的类型不同:
- list()返回List;
- iterate()返回Iterate。
2.查询策略不同:
- list()直接发送sql语句,查询数据库;
- iterate()发送sql语句,从数据库取出id,然后先从缓存中根据id查找对应信息,有就返回结果,没有就根据id发送sql语句,查询数据库。
3.返回对象不同:
- list()返回持久化实体类对象;
- iterate()返回代理对象。
4.与缓存的关系不同:
- list()只缓存,但不使用缓存;
- iterate()会使用缓存
5.缓存总结
- Hibernate的缓存能够提升检索效率。
- Hibernate有会话级缓存,一级缓存;应用级缓存,二级缓存。
- Hibernate缓存在提高检索的同时,也会增加资源消耗,需要注意使用缓存策略。