【MyBatis】缓存机制

本文介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的工作原理及配置。一级缓存是SqlSession层面的缓存,不同SqlSession之间隔离;二级缓存是SqlSessionFactory层面的缓存,需要在映射文件中配置并要求返回的POJO实现Serializable接口。文中还讨论了如何避免脏读问题以及注解方式启用二级缓存。
摘要由CSDN通过智能技术生成

概述

什么是缓存

     缓存是在计算机内存上进行保存的数据,其特点是将数据保存在内存当中。

为什么使用缓存

    缓存在读取的时候不需要再从磁盘读入,因此具有快速读取和使用的特点。

什么时候适合用缓存

如果缓存命中率高,可以极大提升系统性能。如果缓存的命中率比较低,就没有使用缓存的必要。因此关键在于存储的内容访问的命中率.

比较适用于:经常查询但是不经常改变的,数据的正确与否对最终结果的影响不大时。

不适用于:经常改变的数据,数据的正确与否对最终结果的影响比较大时。

MyBatis中的缓存

一级缓存

MyBatis默认情况下只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。

所在在查询的参数和SQL语句不变的情况下,使用同一个SqlSession对象调用同一个Mapper的方法,往往只执行一次SQL,在第一次进行查询之后,会将查询的结果存放到缓存当中,以后如果再次查询,如果没有声明需要刷新,并且缓存也没有超时的情况下,SqlSession会取出当前缓存的结果,而不是再次发送SQL到数据库。但是如果是不同的SqlSession对象,他们之间是相互隔离的,所以对于不同的SqlSession对象执行相同的SQL,还是会向数据库发起缓存。当SqlSession对象消失时,其对应的一级缓存同样消失。

测试两个不同的SqlSession对象执行相同的查询:

    public void testFindById(){
        SqlSession sqlSession1 = factory.openSession();
        IUserDao userDao1 = sqlSession1.getMapper(IUserDao.class);
        System.out.println("第一次查询");
        User user1 = userDao1.findById(62);
        System.out.println(user1);

        SqlSession sqlSession2 = factory.openSession();
        IUserDao userDao2 = sqlSession2.getMapper(IUserDao.class);
        System.out.println("第二次查询");
        User user2 = userDao2.findById(62);
        System.out.println(user2);
        sqlSession1.close();
        sqlSession2.close();
        System.out.println(user1==user2);
    }

发现使用不同的SqlSession对象是,执行相同的查询语句其结果是不同的。

通过下面程序进行测试同一个SqlSession对象执行两次相同的查询操作:

public class UserTest {
    privat
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程芝士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值