Mybatis缓存

1、一级缓存
​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。
默认是有一级缓存的,一级缓存只针对于使用同一个SqlSession的情况。
一级缓存的范围有SESSION和STATEMENT两种,默认是SESSION,如果我们不需要使用一级缓存,那么我们可以把一级缓存的范围指定为STATEMENT,这样每次执行完一个Mapper语句后都会将一级缓存清除。如果需要更改一级缓存的范围,请在Mybatis的配置文件中,在下通过localCacheScope指定。

  <setting name="localCacheScope" value="SESSION"/>

如下示例

public static void main(String[] args) {
        // 自定义的单例SqlSessionFactory模式
        SqlSessionFactory factory = SqlSessionFactoryUtil.openSqlSession();

        // 获得SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 获得dao实体
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 进行两次相同的查询操作
        userMapper.selectByPrimaryKey(1);
        userMapper.selectByPrimaryKey(1);
        // 注意,当我们使用二级缓存时候,sqlSession需要使用commit时候才会生效
        sqlSession.commit();

        System.out.println("\n\n=============================================================");
        // 获得一个新的SqlSession 对象
        SqlSession sqlSession1 = factory.openSession();
        // 进行相同的查询操作
        sqlSession1.getMapper(UserMapper.class).selectByPrimaryKey(1);
        // 注意,当我们使用二级缓存时候,sqlSession需要使用commit时候才会生效
        sqlSession1.commit();
    }

2、二级缓存

一级缓存是sqlSession级别的,二级缓存是mapper级别的
二级缓存是默认启用的,如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。

  <setting name="cacheEnabled" value="false" />

可以在开启二级缓存时候,手动配置一些属性

<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

各个属性意义如下:

eviction:缓存回收策略
LRU:最少使用原则,移除最长时间不使用的对象
FIFO:先进先出原则,按照对象进入缓存顺序进行回收
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极的移除移除基于垃圾回收器状态和弱引用规则的对象
flushInterval:刷新时间间隔,单位为毫秒,这里配置的100毫秒。如果不配置,那么只有在进行数据库修改操作才会被动刷新缓存区
size:引用额数目,代表缓存最多可以存储的对象个数
readOnly:是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。
可以在Mapper的具体方法下设置对二级缓存的访问意愿:

useCache配置
​ 如果一条语句每次都需要最新的数据,就意味着每次都需要从数据库中查询数据,可以把这个属性设置为false,如:

<select id="selectAll" resultMap="BaseResultMap" useCache="false">

刷新缓存(就是清空缓存)
​ 二级缓存默认会在insert、update、delete操作后刷新缓存,可以手动配置不更新缓存,如下:

<update id="updateById" parameterType="User" flushCache="false" />

猜你喜欢

转载自blog.csdn.net/qazwsx081/article/details/80065794