MyBatis——缓存机制

MyBatis的缓存机制
    MyBatis的查询缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存,二级缓存是多个SqlSession共享的。
    一级缓存:
        在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。在同一个SqlSession中执行两次相同的sql语句,第一次执行完毕会将查询数据写到缓存(内存),第二次执行时会从缓存中获取数据,不再去底层数据库查询。若SqlSession执行了DML操作(insert、update、delete),并提交(commit())到数据库,MyBatis将会清空SqlSession中的一级缓存。当一个SqlSession结束(close())后该SqlSession中的一级缓存也就不存在了。MyBatis默认开启一级缓存,不需要进行任何配置。
    二级缓存
        二级缓存是mapper级别的缓存,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会缓存在二级缓存区域,同样使用HashMap进行数据存储。二级缓存是跨SqlSession的,其作用域是mapper的同一个namespace。不同的SqlSession两次执行相同namespace下同一sql语句,第一次执行把查询到的数据写到缓存,第二次查询从缓存中获取数据。MyBatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。

        二级缓存Mybatis配置文件mybatis-config.xml配置:

    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true" />
    </settings>

        二级缓存mapper文件配置:

    <!-- 开启当前mapper的namespace下的二级缓存 -->
    <!-- 创建一个LRU缓存,每隔60秒刷新,最大存储512个对象,返回对象只读 -->
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true" />

            eviction 收回策略,默认为LRU
                    LRU。最近最少使用的策略,移除最长时间不被使用的对象。
                    FIFO。先进先出策略,按照对象进入缓存的顺序移除。
                    SOFT。软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
                    WEAK。弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象。

示例:同一个SqlSession和namespace,先后执行selectById(1)、deleteById(5)、selectById(1)。
    执行第一个selectById(1)时,执行select语句查询到的数据缓存到一级和二级缓存中;当执行deleteById(5)后,MyBatis为保证缓存中存储的是最新信息会清空一级缓存SQLSession,但是因为开启了二级缓存,再执行selectById(1)时,会去从二级缓存中查找,所以不会再次执行select语句。
示例:不同SqlSession同一namespace,先执行一次selectById(1)然后关闭SqlSession,再新建一个SqlSession然后执行一次selectById(1)
    第一次执行selectById(1)时会执行select语句,在第二次执行selectById(1)时,由于开启二级缓存当MyBatis没有在一级缓存中找到查询结果时,会去二级缓存中查找到,所以select语句不会再次执行。

在select中设置useCache="false"可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认为true。 

posted @ 2019-04-11 13:51  !O0O!  阅读(152)  评论(0)    收藏  举报