Mybatis缓存

Mybatis缓存

查询:连接数据库,耗费资源。
可以将一次查询得到的数据暂时保存在可以直接取道的地方。内存。缓存。下次在取数据的时候,直接走缓存,不走数据库,就提高了查询效率。
1.缓存它是内存中的临时数据。不持久。
2.减少了和数据库的交互次数。减少了系统的开销
3.经常查询并且不经常改变的数据。

mybatis 可以配置缓存也可以定制缓存。
Mybatis 中默认定义了两级缓存:
一级缓存
二级缓存

一级缓存

默认情况下,只有一级缓存是开启的,本地缓存,是SqlSession 级别的缓存。默认开启的,无法关闭。

二级缓存

二级缓存是需要手动开启和配置的。是基于namespace级别的缓存。

通过接口 Cache 来定义二级缓存。

二级缓存也叫做全局缓存,一级缓存的作用域太低了。

基于namespace 级别的缓存。一个命名空间对应一个二级缓存。

工作机制:
1.一个回话查询一条数据,这个数据就会被放在当前回话的一级缓存中。
2.当会话被关闭的时候,这个回话对应的一级缓存就没有了,当会话关闭的时候,数据保存在二级缓存中。
3.新的会话查询数据就可以从二级缓存中取到数据,
4.不同的mapper.xml 查询出来的数据会放在自己对应的二级缓存(map)中。
需要实现 Cache 接口

在mybatis核心配置文件中开启二级缓存

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

在需要实现二级缓存的 mapper.xml 中开启

<!--    开启了二级缓存 这种形式属性都是默认的。-->
    <cache/>

但是也有属性:
	eviction :FIFO。输入输出
	flushInterval:60000 。 每隔60秒刷新
	size : 512。最多可以放512个对象
	readOnly : 只读


<!--    开启了二级缓存-->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

在需要使用二级缓存的select 标签中添加 useCache 属性

 <select id="findAccountById" parameterType="int" resultType="account" useCache="true">
        select * from account where id = #{id}
    </select>

测试

// 测试二级缓存
    @Test
    public void findAccountByIdTestCache(){
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        AccountXMLMapper accountXMLMapper1 = sqlSession1.getMapper(AccountXMLMapper.class);
        Account accountById1= accountXMLMapper1.findAccountById(2);
        System.out.println(accountById1);
        sqlSession1.close();
        System.out.println("---------------");
        // 修改
//        Account account = new Account(1,"MAGIC",1000);
//        int i = accountXMLMapper.updateAccount(account);
//        System.out.println(i);
//        System.out.println("---------------");

        // sqlSession.clearCache(); // 手动清除缓存

        SqlSession sqlSession2 = MybatisUtils.getSqlSession();
        AccountXMLMapper accountXMLMapper2 = sqlSession2.getMapper(AccountXMLMapper.class);
        Account accountById2= accountXMLMapper2.findAccountById(2);
        System.out.println(accountById2);
        sqlSession2.close();

    }


在这里插入图片描述
报错时注意:看实体类是否实现了 序列化接口。
注意:所有的数据都先会放在一级缓存中,会话关闭或者提交,会将数据转移到二级缓存中。
缓存的顺序:先看二级缓存,在看一级缓存,最后才看数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦愿鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值