• mybatis开启缓存cache


    前言

            默认情况下,MyBatis开启了一级缓存。它是SqlSession内部的一个缓存。
            二级缓存是需要手动开启的,并且它是跨 SqlSession 的缓存,二级缓存是基于namespace级别的,一个命名空间对应一个二级缓存。
            注意:我们在使用缓存的时候要记得序列化实体类,否则会抛出实体类未序列化异常。
    开启步骤:

    1.开启二级缓存

            在 mybatis-config.xml 的配置文件中进行显示配置,开启二级缓存(全局缓存)

    1. <settings>
    2. <setting name="cacheEnabled" value="true"/>
    3. </settings>
    2.配置缓存策略

            在 Mapper.xml 文件中添加cache标签

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

    具体参数说明:

    • eviction代表缓存回收策略,目前mybatis提供以下回收策略:

            LRU(Least Recently Used):最近最少使用的,回收最长时间不用的对象;
            FIFO(First in first out):先进先出,按照对象进入缓存的顺序来移除;
            SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
            WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。

    • flushInterval:缓存刷新时间间隔,单位为毫秒,每经过相应时间会对缓存进行刷新,如果没有配置,当SQL被执行的时候才会刷新缓存。
    • readOnly:只读,设置只读为“true”意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是没有办法修改缓存,它的默认值是false,不允许修改。
    • size:引用数目,是一个整数,代表缓存最多可以存储多少的对象,该数据不宜设置过大,如果设置过大会导致内存溢出。
    3. useCache和flushCache 

            userCache是用来设置是否禁用二级缓 存的,在statement中设置useCache=false可以禁⽤当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存,还可以使用注解方式禁用@Options(useCache=false),flushCache的注解配置方法同上 。

    1. 方式一:
    2. <select id="selectUserByOrderId" useCache="false"
    3. resultType="com.baixinda.bean.Order" parameterType="int">
    4. select * from order where id=#{id}
    5. </select>
    6. 方式二:
    7. @Options(useCache = false)
    8. @Select({"select * from order where id = #{id}"})
    9. public User findOrderById(Integer id);

            这种情况是针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存,直接从数 据库中获取。
            在mapper的同一个namespace中,如果有其它insert、update, delete操作数据后需要刷新缓 存,如果不执行刷新缓存会出现脏读。
            设置statement配置中的flushCache="true”属性,默认情况下为true,即刷新缓存,如果改成false则 不会刷新。使用缓存时如果⼿动修改数据库表中的查询数据会出现脏读。

    1. 方式一:
    2. <select id="selectUserByOrderId" flushCache="true" useCache="false"
    3. resultType="com.baixinda.bean.Order" parameterType="int">
    4. select * from order where id=#{id}
    5. </select>
    6. 方式二:
    7. @Options({useCache = false, flushCache="true"})
    8. @Select({"select * from order where id = #{id}"})
    9. public User findOrderById(Integer id);

    另外:一般情况下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。所以我们不用设置,默认即可 。

  • 相关阅读:
    【LeetCode】2586. 统计范围内的元音字符串数
    leetCode 718.最长重复子数组 动态规划 + 优化(滚动数组)
    Spring的@Async使用防坑
    【前端】什么是面包屑?
    第1章 模拟器/真机对后端数据的获取之后端实现
    1029 旧键盘
    android:configChanges属性总结
    Chat GPT 使用教学,文字创作、学习
    maven exclusion 理解
    动态规划 - 路径总数 & 最小路径和
  • 原文地址:https://blog.csdn.net/A_aspectJ/article/details/136358465