mybatis缓存
Mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能
mybatis缓存分类
Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存:
- 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个 数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap) 是互相不影响的。
- 二级缓存是Mapper(namespace)级别的缓存。多个SqlSession去操作同一个Mapper的sql语 句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
一级缓存
如果是执行两次service调用查询相同 的用户信息,是不走一级缓存的,因为mapper方法结束, sqlSession就关闭,一级缓存就清空。
二级缓存
二级缓存配置
- 在核心配置文件SqlMapConfig.xml中加入以下内容(开启二级缓存总开关):
<!-- 开启二级缓存总开关 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在UserMapper映射文件中,加入以下内容,开启二级缓存:
<!-- 开启本mapper下的namespace的二级缓存,默认使用的是mybatis提供的PerpetualCache ->
<select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User" useCache="true">
SELECT * FROM user WHERE id = #{id}
</select>
注意事项:
- 在使用二级缓存的时候,要设置一下刷新间隔(cache标签中有一个flashInterval属性)来定时 刷新二级缓存,这个刷新间隔根据具体需求来设置,比如设置30分钟、60分钟等,单位为毫秒。
局限性:
Mybatis二级缓存对细粒度的数据级别的缓存实现不好。 - 场景:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次查询都是最新的商品信息, 此时如果使用二级缓存,就无法实现当一个商品发生变化只刷新该商品的缓存信息而不刷新其他商 品缓存信息,因为二级缓存是mapper级别的,当一个商品的信息发送更新,所有的商品信息缓存 数据都会清空。
- 解决方法此类问题,需要在业务层根据需要对数据有针对性的缓存。 比如可以对经常变化的 数据操作单独放到另一个namespace的mapper中。