mybatis缓存机制
2016-01-09 03:10
337 查看
Mybatis和Hibernate一样,也提供了一二级缓存。若存在一二级缓存,则数据不会去数据库交互,而是去内存中获取。
一级缓存:
一级缓存是sqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(一般来说是hashMap)来存储缓存数据。
不同的sqlSession之间的缓存区域是不影响的。
如下图:
第一个用户查询时,如果开启了缓存,则sqlSession会将第一个用户查询的数据放到缓存中。以后如果有人进行修改、新增或者删除时,缓存会将已有数据清空(避免脏数据),然后重新放入。其他人查询时会优先从缓存中取。
一级缓存应用:
sqlSession可以理解为mybatis为每一个用户的每一组操作(一个service方法内多次调用数据库)生成的一个sql会话。
事务控制在service层,sqlSession在事务关闭时清空。如果一个service同时调用多次某个方法,则第一次以后会从sqlSession里面获取。
一级缓存只限于同一个sqlSession内,如果两次调用同一个service相同的方法查询,则不会使用一级缓存。
如下图:
二级缓存的使用首先要开启二级缓存。第一个sqlSession调用mapper里的方法查询信息后,信息会保存到二级缓存,如果有其他sqlSession做了更新或者删除操作,二级缓存会清空。再一次查询的sqlSession又会将数据写入二级缓存,其他的sqlSession会优先从二级缓存中获取数据。
二级缓存应用:
二级缓存比一级缓存的作用区域大。可以对不同的sqlSession提供服务。一个Mapper只有一个二级缓存区域。mapper按照namespace分配缓存区域。
<!-- 设置缓存 -->
<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>
一级缓存:
一级缓存是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>
相关文章推荐
- mybatis延迟加载
- Codeforces 615D Multipliers 【组合数学】
- Codeforces 615B Longtail Hedgehog 【dp】
- 基于Python SimpleHTTPServer.py的修改脚本:HTTP文件服务器,修正中文目录列表,支持视频文件在线播放
- hdoj 4578 Transformation 【线段树 区间加、乘、修改、幂次求和】
- Codeforces 615A Bulbs 【水题】
- hdoj 4614 Vases and Flowers 【线段树 + 二分】
- hdoj 4553 约会安排 【线段树区间合并】
- hdoj 3974 Assign the task 【DFS + 线段树区间修改】
- hdoj 1540 Tunnel Warfare 【线段树 区间合并】
- zoj 3777 Problem Arrangement 【状压dp】
- poj 1390 Blocks 【区间dp】
- nyoj 10 skiing 【记忆化】
- nyoj 737 石子合并(一) 【区间dp】
- mybatis动态sql
- vim 基础学习之插入模式
- mybatis常见问题
- LeetCode Jump Game II
- 数据库第三范式
- mybatis常用配置——resultMap