mybatis缓存
来源:互联网 发布:mac新建txt 编辑:程序博客网 时间:2024/06/04 01:14
Mybatis的一级缓存:
1.为什么需要使用缓存:
a) 如果在极短时间内,做相同的查询,那么它们的结果很可能是相同,而访问一次数据库是非常消耗资源的。如果有一层缓存,将极大减少资源的消耗。
2.mybatis的一级缓存
mybatis的一级缓存是SqlSession,其内部是通过一个hashmap来实现的,hashmap的键是数据库记录的主键。每个SqlSession之间是相互独立的。
3.mybatis的一级缓存的生命周期:
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对象的数据,但是该对象可以继续使用;
4.mybatis的一级缓存的查询流程
1.对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果;
2.判断从Cache中根据特定的key值取的数据数据是否为空,即是否命中;
3.如果命中,则直接将缓存结果返回;
4.如果没命中:
4.1 去数据库中查询数据,得到查询结果;
4.2 将key和查询到的结果分别作为key,value对存储到Cache中;
4.3. 将查询结果返回;
Mybatis的二级缓存:
二级缓存和一级缓存的使用顺序:
请注意,如果你的MyBatis使用了二级缓存,并且你的Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存,即MyBatis查询数据的顺序是:
二级缓存 ———> 一级缓存——> 数据库
如果二级缓存中没有,查询一级缓存,如果在一级缓存中有,将查询的结果存入二级缓存,并换回给用户,如果没有查询数据库,并一级一级的返回存入缓存,在返回给用户。
Mybatis二级缓存的配置:
要想使某条Select查询支持二级缓存,你需要保证:
1. MyBatis支持二级缓存的总开关:全局配置变量参数 cacheEnabled=true <!-- 二级缓存开启 --> <setting name="cacheEnabled" value="true"/>2.该select语句所在的Mapper,配置了<cache> 或<cached-ref>节点,并且有效 <!-- 开启当前mapper的namespace下的二级缓存, 配置了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的 --> <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"></cache>3. 该select语句的参数 useCache=true如下: <select id="selectByMinSalary" resultMap="BaseResultMap" parameterType="java.util.Map" useCache="true">
Mybatis二级缓存对于缓存容量满了的处理方法:
对于每个Cache而言,都有一个容量限制,MyBatis各供了各种策略来对Cache缓存的容量进行控制,以及对Cache中的数据进行刷新和置换。MyBatis主要提供了以下几个刷新和置换策略:
LRU:(Least Recently Used),最近最少使用算法,即如果缓存中容量已经满了,会将缓存中最近做少被使用的缓存记录清除掉,然后添加新的记录;
FIFO:(First in first out),先进先出算法,如果缓存中的容量已经满了,那么会将最先进入缓存中的数据清除掉;
Scheduled:指定时间间隔清空算法,该算法会以指定的某一个时间间隔将Cache缓存中的数据清空;
MyBatis并不是简单地对整个Application就只有一个Cache缓存对象,它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下:
a.为每一个Mapper分配一个Cache缓存对象(使用节点配置);
b.多个Mapper共用一个Cache缓存对象(使用节点配置);
a.为每一个Mapper分配一个Cache缓存对象(使用节点配置)
MyBatis将Application级别的二级缓存细分到Mapper级别,即对于每一个Mapper.xml,如果在其中使用了 节点,则MyBatis会为这个Mapper创建一个Cache缓存对象,如下图所示:
注: 上述的每一个Cache对象,都会有一个自己所属的namespace命名空间,并且会将Mapper的 namespace作为它们的ID;
b.多个Mapper共用一个Cache缓存对象(使用节点配置)
如果你想让多个Mapper公用一个Cache的话,你可以使用节点,来指定你的这个Mapper使用到了哪一个Mapper的Cache缓存。
参考:http://blog.csdn.net/luanlouis/article/details/41408341
- MyBatis-缓存
- MyBatis 缓存
- mybatis缓存
- mybatis缓存
- MyBatis 缓存
- mybatis 缓存
- mybatis缓存
- MyBatis缓存
- MyBatis缓存
- MyBatis 缓存
- mybatis 缓存
- Mybatis缓存
- mybatis 缓存
- Mybatis缓存
- MyBatis 缓存
- mybatis缓存
- MyBatis缓存
- Mybatis缓存
- Java使用HttpURLConnection上传文件
- 日历组件的编写--html/css/js
- 线段树 区间求和模板 (区间修改)
- FusionInsight HD HBase 常用API
- Android5.0,6.0,7.0,8.0新特性整理
- mybatis缓存
- 排序方法稳定性总结
- 线段树 点更新 区间和 模板
- heap_2.c详解--------FreeRTOS内存管理
- Python基础笔记
- 使用TensorFlow-Slim进行图像分类
- 模运算法则
- 常用排序算法总结
- Hive动态分区