MyBatis缓存机制:二级缓存(mapper级别)

二级缓存是Mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,他同样是使用HashMap进行数据存储.相比一级缓存SqlSession,二级缓存的范围更大,多个SqlSession可以公用二级缓存,二级缓存是跨SqlSession的.
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的SqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,这第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再底层数据库查询,从而提高查询效率.
MyBatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存.
示例:TwoLevelCacheTest
接下来测试MyBatis的二级缓存,所有代码和测试一级缓存的代码完全一样,只是需要在配置文件中开启二级缓存.
1.编辑MyBatis配置文件
    <!-- 开启二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
2.编辑Usermapper.xml
    <!-- 开启当前mapper的namespace下的二级缓存 -->
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true" />
以上配置创建了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的
cache元素用来开启当前mapper的namespace下的二级缓存.该元素的属性设置如下:
flushInteval:刷新时间间隔,可以被设置为任意的正整数,而且他们代表一个合理的毫秒形式的时间段,默认情况下是不设置,也就是没有刷新间隔,缓存仅仅调用语句是刷新.
size:缓存数目,可以被设置为任意正整数,要记住你的缓存的对象数目和你运行环境的可用内存资源数目,默认值是1024
readOnly:只读,属性可以被设置为true或false,只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势,可读写的缓存会返回缓存对象的拷贝(通过序列化),这会慢一些,但是安全,因此默认是false.
eviction:收回策略,默认为LRU
    LRU:最近最少使用的策略,移除最长时间不被使用的对象
    FIFO:先进先出测试,按对象进行缓存的顺序来移除他们
    SOFT:软引用策略,移除基于垃圾回收器状态和软引用规则的对象
    WEAK:弱引用策略,更积极的移除基于垃圾收集器状态和弱引用规则的对象
3.控制器
    public void cache3()
    {
        //获得SqlSession实例
        SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
        //获得Mapper接口代理对象
        UserMapper em = sqlSession.getMapper(UserMapper.class);
        //按ID查询
        User user1 = em.selectUserById(5);
        
        //重新获取sqlSession执行同样的查询
        SqlSession sqlSession2 = FKSqlSessionFactory.getSqlSession();
        //获得Mapper接口代理对象
        UserMapper em2 = sqlSession.getMapper(UserMapper.class);
        //按ID查询
        User user2 = em2.selectUserById(5);
    }
4.输出
在第一次查询id为5的User对象时执行了一条select语句,当重新获取了SqlSession对象之后,查询id为5的User对象时,并没有实际执行select语句,而是从缓存中返回了User对象