MyBatis 一级缓存和二级缓存验证

先上干货:

1.MyBatis缓存
    a)一级缓存:SqlSession
        a)默认开启的
        b)一级缓存只对当前SqlSession有效
    b)二级缓存:SqlSessionFactory
        b)默认是关闭的,需要手动开启
        b)如何开启二级缓存呢?
            a)在Mapper文件中添加<cache>标签
            b)放在缓存中的对象需要实现序列化接口
                1)对象序列化(保证对象读写一致的)
                2)版本号
            c)事务需要提交
        c)每个SQLSession共享
2.缓存的概念
    1)缓存是提高查询效率,减少和数据库的交互
    2)最大的问题就是同一个数据放了两个地方
        a)修改数据库,刷新缓存
3.适合放入缓存中的数据
    1)经常被查询
    2)很少被修改
4.不适合放入缓存中的数据
    1)经常被修改
    2)很少被查询
    3)重要的数据(公共的资源,票,钱)

首先测试一级缓存:运行测试代码
同一个sqlsession中多次查询
在这里插入图片描述
运行结果:
在这里插入图片描述

  • 通过结果可知:
  • 同一个sqlsession只要未关闭可以进行多次操作(增删改查等 即:调增删改查相关方法方法)
  • 第一次查询时会提交sql语句,之后相同的操作都不会再提交sql,因为有一级缓存(sqlsession范围的缓存),相同
    的操作后续会从缓存中获取结果
  • 但是,一旦sqlsession关闭(即:与数据库会话断开) 再操作就会报错"Executor was closed"(执行对象被关闭)

测试二级缓存:运行测试代码
不同的sqlsession查询相同的内容,未开启二级缓存时每个sqlsession都会发送sql
在这里插入图片描述
结果:
在这里插入图片描述
当我们开启二级缓存后:

开启方法:
a)在Mapper文件中添加<cache>标签
b)放在缓存中的对象需要实现序列化接口
        1)对象序列化(保证对象读写一致的)
        2)版本号
c)事务需要提交

在这里插入图片描述
结果:第二个sqlsession是从二级缓存中获取数据,而没有单独再发送一次sql.
在这里插入图片描述
mapper标签:改标签有默认参数值 也可以手动设置
在这里插入图片描述

参数含义解读:
<!--
        size:设置缓存中最大能放1024个对象
        readOnly:设置放在缓存中的数据是否是只读的(一般都是只读的)
        eviction:设置缓存的清空策略
            LRU:最少使用原则,移除最长时间不使用的对象
            FIFO:先进先出原则,按照对象进入缓存顺序进行回收
         flushInterval:缓存刷新时间间隔
    -->
    <cache size="1024" readOnly="true" eviction="LRU" flushInterval="100000"/>

实例对象实现序列化接口:Serializable
在这里插入图片描述
Mybatis默认会将所有的查询结果缓存起来,但很多场景中我们不希望他缓存 如:金融相关的账号信息 此时我们就需要关闭其缓存功能. 此时可以在mapper配置文件的查询中加入useCache="false"属性.但要注意 对一级缓存无效

 <!--
        useCache
            true:默认值
            false:可以设置这条sql语句的结果不缓存,只是对二级缓存才有效
    -->
    <select id="getUserById" resultMap="userResultMap" useCache="false">
        select * from t_user where id = #{id}
    </select>

补充:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值