缓存


概述

缓存:存在于内存中的临时数据

使用缓存的优势

减少和数据库的交互次数,提高程序执行效率

缓存的使用条件

  • 适用于缓存:
    • 经常查询并且不经常改变
    • 数据的正确与否与最终的结果影响不大的数据
  • 不适用于缓存:
    • 经常改变的数据
    • 数据的正确与否与最终的结果影响大的数据
    • 例如:商品库存,银行汇率,股市牌价

分类

一级缓存(本地缓存)
二级缓存

一级缓存

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"

文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录