您的位置:首页 > 其它

[MyBatis]二级缓存

2016-05-09 09:33 363 查看
二级缓存:

Session去执行该Mapper下的查询方法时(第一次查询),会将该查询结果存放在Mapper的二级缓存区域

Session去执行该Mapper下的查询方法时(第二次查询),会判断该Mapper下有没有缓存,如果有,则不向数据库查询,直接取缓存

Session去执行该Mapper下的commit()方法后,则清空该Mapper下的二级缓存

二级缓存与一级缓存的区别:

多个Session可以共享Mapper下的数据,二级缓存是按照Mapper的namespace划分,每一个Mapper都有自己的二级缓存区域,如果两个Mapper的namespace相同,那么这两个Mapper共用一个二级缓存区域

开启二级缓存:

先向总配置文件开启二级缓存,SqlMapConfig.xml中

<configuration>
<!--
//....
-->

<!-- 全局配置参数,需要时再设置 -->
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

</configuration>


在Mapper.xml中

<mapper namespace="mapper.OrdersMapper" >
<!--
//....
-->

<!-- 开启本mapper下的namespace二级缓存 -->
<cache />
</mapper>


在POJO类中实现序列化接口

public class Orders implements Serializable {
/**
* 为什么要实现Serializable接口呢?
* 实际上mybaties在存储二级缓存数据时,不止是将数据存放在内存中,
* 还会将数据存放在硬盘中,还可能会放在其他地方,有很多种可能性,
* 所以要取硬盘中的数据时,因为实现了Serializable接口,
* 就可以反序列化取了.
*/
}


禁用二级缓存

在Mapper.xml中,可以将个别select查询设置为禁用二级缓存

<!--
useCache:是否禁用二级缓存
1>默认为true(开启二级缓存)
2:false:禁用二级缓存
-->
<!-- 根据用户id查询订单 -->
<select id="findOrdersByUserId" parameterType="int" resultMap="order_user"
useCache="false" >
SELECT
o.*,
u.username,u.sex,u.address
FROM
orders AS o , user AS u
WHERE
o.user_id = #{value} AND u.id = o.user_id
</select>


刷新缓存(清空缓存)

在Mapper.xml中,可以将个别添加,删除,更新的statement设置刷新缓存属性,一般执行完commit()之后都会执行刷新缓存,所以一般不用设置此属性,使用默认值即可.

<!--
flushCache:刷新缓存(就是清空缓存里的所有数据)
1>flushCache="true":开启刷新缓存
2>flushCache="false":关闭刷新缓存
一般执行完commit()之后都会执行刷新缓存,
刷新缓存也就是flushCache="true",
可以避免脏读.
-->
<delete id="deleteUser" parameterType="int" flushCache="true">
delete from user where id = #{id}
</delete>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: