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主要提供了以下几个刷新和置换策略:

  1. LRU:(Least Recently Used),最近最少使用算法,即如果缓存中容量已经满了,会将缓存中最近做少被使用的缓存记录清除掉,然后添加新的记录;

  2. FIFO:(First in first out),先进先出算法,如果缓存中的容量已经满了,那么会将最先进入缓存中的数据清除掉;

  3. 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

原创粉丝点击