初次接触Mybatis二级缓存

写完一个小需求后突发奇想,这个需求需要频发查询但是不需要经常更改,而且查询量较大,多地使用,于是就想怎么才能解决这个频繁查询带来的压力,就想了各种缓存方法,最先想到Redis查询,但是不想更改架构,于是就选择Mybatis自带的二级缓存,查了一下,缓存自带更新机制,当调用了update,delete,insert语句自动清空缓存,这个条件能满足绝大部分的情况,于是就做了实践

第一在Mybatis配置文件中开启缓存

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>  

然后配置Maper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 门店表的映射文件    namespace值为对应接口的全路径 -->
<mapper namespace="com.yl.dao.DoorDao">
    <!--开启本mapper的namespace下的二级缓存-->
    <!--
        eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
        (1) LRU,最近最少使用的,一处最长时间不用的对象
        (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们
        (3) SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象
        (4) WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,
                移除最长时间不用的对形象

        flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当
        SQL被执行的时候才会去刷新缓存。

        size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
        这里配置的是1024个对象

        readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有
        办法修改缓存,他的默认值是false,不允许我们修改
    -->
    <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>
    <!-- 1.查询所有门店信息,id值为对应接口中方法的名字
        resultType指定将查询的结果封装到哪个pojo对象中
     -->
     <!--可以通过设置useCache来规定这个sql是否开启缓存,ture是开启,false是关闭-->
    <select id="findAll" resultType="com.yl.pojo.Door" useCache="true">
        select * from tb_door
    </select>
        <!-- 2.新增门店信息 -->
    <insert id="addDoor">
        insert into tb_door 
        values(#{id}, #{name}, #{tel}, #{addr})
    </insert>
    <select id="getById" resultType="com.yl.pojo.Door">
        select * from tb_door where id = #{id}
    </select>
    <delete id="deleteById">
        delete from tb_door where id = #{id}
    </delete>
    <!--可以通过设置useCache来规定这个sql是否开启缓存,ture是开启,false是关闭 ,默认是true-->
    <update id="updateDoor" flushCache="true">
        UPDATE tb_door SET name=#{name},tel=#{tel},addr=#{addr} where id = #{id};
    </update>
    
</mapper>

OK 大功告成

测试

DEBUG [http-nio-8080-exec-10] - GET "/yonghe-test/doorList", parameters={}
DEBUG [http-nio-8080-exec-10] - Mapped to public java.lang.String com.yl.controller.DoorController.doorList(javax.servlet.http.HttpServletRequest)
DEBUG [http-nio-8080-exec-10] - Creating a new SqlSession
DEBUG [http-nio-8080-exec-10] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28be3995] was not registered for synchronization because synchronization is not active
DEBUG [http-nio-8080-exec-10] - Cache Hit Ratio [com.yl.dao.DoorDao]: 0.0
DEBUG [http-nio-8080-exec-10] - Fetching JDBC Connection from DataSource
 INFO [http-nio-8080-exec-10] - {dataSource-1} inited
DEBUG [http-nio-8080-exec-10] - JDBC Connection [com.mysql.jdbc.JDBC4Connection@7d8cc17c] will not be managed by Spring
DEBUG [http-nio-8080-exec-10] - ==>  Preparing: select * from tb_door 
DEBUG [http-nio-8080-exec-10] - ==> Parameters: 
DEBUG [http-nio-8080-exec-10] - <==      Total: 6
这是第一次进行了查询并进行缓存
DEBUG [http-nio-8080-exec-10] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28be3995] Door [id=1, name=永和大王(北三环西路店), tel=010-62112313, addr=北三环西路甲18号院-1号大钟寺中坤广场d座] Door [id=2, name=永和大王(知春路店), tel=010-82356537, addr=知春路29号大运金都] Door [id=3, name=永和大王(东直门), tel=010-84477746, addr=东直门外大街48号东方银座b2-08] Door [id=4, name=永和大王(北京站), tel=010-65286602, addr=毛家湾胡同甲13号北京站候车大厅2层] Door [id=5, name=永和大王(学院路店), tel=010-62152539, addr=学院南路37号超市发四道口店四道口西北角] Door [id=9, name=深沟店123, tel=123456789123, addr=出门左拐第一家111] DEBUG [http-nio-8080-exec-10] - View name 'door_list', model {} DEBUG [http-nio-8080-exec-10] - Forwarding to [/WEB-INF/pages/door_list.jsp] DEBUG [http-nio-8080-exec-10] - Completed 200 OK DEBUG [http-nio-8080-exec-3] - GET "/yonghe-test/doorList", parameters={} DEBUG [http-nio-8080-exec-3] - Mapped to public java.lang.String com.yl.controller.DoorController.doorList(javax.servlet.http.HttpServletRequest) DEBUG [http-nio-8080-exec-3] - Creating a new SqlSession DEBUG [http-nio-8080-exec-3] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5ed8b044] was not registered for synchronization because synchronization is not active DEBUG [http-nio-8080-exec-3] - Cache Hit Ratio [com.yl.dao.DoorDao]: 0.5 缓存命中率提高了,直接返回结果 并没有进行查询
DEBUG [http
-nio-8080-exec-3] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5ed8b044] Door [id=1, name=永和大王(北三环西路店), tel=010-62112313, addr=北三环西路甲18号院-1号大钟寺中坤广场d座] Door [id=2, name=永和大王(知春路店), tel=010-82356537, addr=知春路29号大运金都] Door [id=3, name=永和大王(东直门), tel=010-84477746, addr=东直门外大街48号东方银座b2-08] Door [id=4, name=永和大王(北京站), tel=010-65286602, addr=毛家湾胡同甲13号北京站候车大厅2层] Door [id=5, name=永和大王(学院路店), tel=010-62152539, addr=学院南路37号超市发四道口店四道口西北角] Door [id=9, name=深沟店123, tel=123456789123, addr=出门左拐第一家111] DEBUG [http-nio-8080-exec-3] - View name 'door_list', model {} DEBUG [http-nio-8080-exec-3] - Forwarding to [/WEB-INF/pages/door_list.jsp] DEBUG [http-nio-8080-exec-3] - Completed 200 OK

 

 大功告成,下次有机会在查看底层原理

posted @ 2020-06-14 20:38  大司马真菜  阅读(170)  评论(0)    收藏  举报