延迟加载(懒加载)
1.真正要使用数据的时候,才去发送sql语句请求数据库的数据
a)Eg:select * from blog where id =2
后续其实暂时不会用到blog对象中的author对象
懒得执行select * from author where id = ?
只有真正要使用author的时候,才去发送sql语句
b)lazyLoadingEnable:启用懒加载
c)aggressiveLazyLoading :启用不完整加载
缓存
1.概念
a)存储数据(使用频繁的数据)的临时地方
b)常用的属性
i.命中率
ii.最大元素:缓存的最大值
iii.替代策略(清空策略):缓存有最大元素,如果缓存满了,应该清理的数据和不该清理的数据就涉及到了其中的该有的算法
1.LFU:Least Frequently Used 计算频率-频率低的踢出
2.LRU:Least Recently Used 最新被访问的对象被放入缓存池顶部
c)命中
i.如果还有缓存空间,则没有命中的对象直接存储到缓存中
ii.如果缓存满了,就会按照某种策略,将缓存中就对象退出,保存新对象-替代策略
d)存储成本:将数据存入缓存的时间和空间成本
e)索引成本
f)失效:缓存数据需要更新时,缓存数据失效
2.分类
a)技术上:内存/硬盘文件/数据库
b)EE中的分类
i.服务器缓存:设置缓存服务器放置在web应用服务器的前面,将用户的请求和应用服务器的响应写入缓存服务器,为后续用户的访问提供更快的响应
ii.数据库缓存:配置数据库缓存,数据库存储过程,连接池技术等,数据库缓存挂掉重建缓存会瞬间导致数据库压力增大
iii.浏览器缓存:h5中storage,缓存html和图片/js/css
iv.内存缓存:分布式缓存机制
c)缓存和应用的耦合度
i.Local cache
ii.Remote cache:支持多种语言
3.一级缓存:基于session的缓存,同一个session下的数据实现缓存共享
a)sqlSession存在缓存的概念
b)Sqlsession查询出来的数据会默认被放入缓存中
c)Sql语句session发送,session每次发送sql语句之前,会先进入缓存区域查看是否有相同sql语句结果是否存在
d)如果存在,就直接从缓存中去数据
e)如果不存在,才发送sql语句去数据库端取数据
4.二级缓存:不同session下的数据实现缓存共享,SqlSessionFactory的缓存
a)配置二级缓存
b)配置映射支持的二级缓存
c)映射类实现序列化
i.对象序列化:对对象进行压缩,解压缩,方便进行对象的存储(从内存到文件系统中)
ii.二级缓存经常会被配置在其他地方,提升技能,但是容易崩溃
d)Session被关闭后数据进入二级缓存
e)步骤
i.b)启用二级缓存
1.Config.xml
2.<setting name = “cacheEnable” value=”true”>
ii.Mapper.xml
1.<cache></cache>
iii.Model对象进行序列化
1.实现serializable接口
iv.Test.java
1.session.close
5.一级缓存和二级缓存
a)查询出来的数据会默认存入一级缓存,配置当前mapper支持二级缓存,存在二级缓存
b)当出现commit操作的时候,二级缓存还是一级缓存都会被刷新
c)可以禁用当前查询缓存:userCache
d)缓存实现:hashMap/同步