您的位置:首页 > 其它

mybatis缓存机制

2016-01-09 03:10 337 查看
Mybatis和Hibernate一样,也提供了一二级缓存。若存在一二级缓存,则数据不会去数据库交互,而是去内存中获取。

一级缓存:

一级缓存是sqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(一般来说是hashMap)来存储缓存数据。
不同的sqlSession之间的缓存区域是不影响的。
如下图:



第一个用户查询时,如果开启了缓存,则sqlSession会将第一个用户查询的数据放到缓存中。以后如果有人进行修改、新增或者删除时,缓存会将已有数据清空(避免脏数据),然后重新放入。其他人查询时会优先从缓存中取。



一级缓存应用:

sqlSession可以理解为mybatis为每一个用户的每一组操作(一个service方法内多次调用数据库)生成的一个sql会话。
事务控制在service层,sqlSession在事务关闭时清空。如果一个service同时调用多次某个方法,则第一次以后会从sqlSession里面获取。
一级缓存只限于同一个sqlSession内,如果两次调用同一个service相同的方法查询,则不会使用一级缓存。

二级缓存:

二级缓存是mapper级别的缓存,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存是跨sqlSession的。

如下图:



二级缓存的使用首先要开启二级缓存。第一个sqlSession调用mapper里的方法查询信息后,信息会保存到二级缓存,如果有其他sqlSession做了更新或者删除操作,二级缓存会清空。再一次查询的sqlSession又会将数据写入二级缓存,其他的sqlSession会优先从二级缓存中获取数据。



二级缓存应用:
二级缓存比一级缓存的作用区域大。可以对不同的sqlSession提供服务。一个Mapper只有一个二级缓存区域。mapper按照namespace分配缓存区域。

开启二级缓存:

在mysql-config.xml中开启二级缓存:

<!-- 设置缓存 -->
<settings>
<setting name="cacheEnabled" value="false" />
</settings>
在mapper.xml中开启二级缓存:
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace ="com.xy.mapper.ProductIndexMapper">

<!-- 开启mapper二级缓存 -->
<cache/>

<resultMap id= "productCategoryMap"
type="com.xy.domain.CategoryDTO">
<id column="ID" property= "id" />
<result column="CATEGORY_NAME" property= "categoryName"/>
<result column="CATEGORY_LEVEL" property= "categoryLevel"/>
<result column="CATEGORY_DESC" property= "categoryDesc"/>
<result column="CREATE_TIME" property= "createTime"/>
<result column="UPDATE_TIME" property= "updateTime"/>
</resultMap>

<!-- useCache="false"禁用某个 sql的二级缓存 -->
<select id= "getCategoryList" resultMap ="productCategoryMap" useCache="false" >
select *
from product_category t
where
t.category_level = 1
</select>
</mapper>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: