概述
缓存:存在于内存中的临时数据
使用缓存的优势
减少和数据库的交互次数,提高程序执行效率
缓存的使用条件
- 适用于缓存:
- 经常查询并且不经常改变
- 数据的正确与否与最终的结果影响不大的数据
- 不适用于缓存:
- 经常改变的数据
- 数据的正确与否与最终的结果影响大的数据
- 例如:商品库存,银行汇率,股市牌价
分类
一级缓存(本地缓存)
二级缓存
一级缓存
mybatis中存入SqlSession的缓存,默认开启
当执行查询后,查询的结果会同时存入SqlSession提供的一块区域中该区域的结构是一个map
当再次查询相同的数据,mybatis会先从sqlSession中去看是否有,有的话,直接使用
一级缓存失效时机
SqlSession对象消失时
手动去调用SqlSession的clearCache时
查询后,调用增删改方法时
一级缓存的生命周期
a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用
二级缓存
mybatis中SqlSessionFactory对象中的缓存。由同一个factory对象创建的SqlSession共享其缓存
可以提高对数据库查询的效率,以提高应用的性能
使用及要求
二级缓存默认是不开启的
- 实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,也就是要求pojo(实体类)实现Serializable接口
- 局部开启:在映射XML文件配置添加
<cache/>
;在查询的sql标签添加属性:useCache="true"
- 全局开启:在SqlMapConfig中添加
<setting name="cacheEnabled" value="true"/>
;在映射XML文件配置添加<cache/>
;在查询的sql标签添加属性:useCache="true"