MyBatis 缓存及其作用域

MyBatis 缓存及其作用域

一级缓存:

作用域在一个SqlSession中(可能有多个或者一个sql执行)

在同一个会话中执行sql语句时会先在一级缓存中查找这个sql是否被执行且存储过执行结果,若有则直接返回,若无则查询数据库。

存储方式是:HashMap、key 为 hashCode+sqlId+Sql 语句。value 为 从查询出来映射生成的 java 对象

默认开启一级缓存

会话期间如果有除查询外的其他sql语句提交后会直接清空缓存、会话结束也会清空缓存。

一个sqlSession过程:

@Test
    public void test(){
    
    

        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        // 方式一:getMapper
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        // 调用我们编写的接口方法
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
    
    
            System.out.println(user);
        }

        // 关闭流对象
        sqlSession.close();
    }

二级缓存

​ Mybatis的二级缓存是指mapper映射文件(或者说是一个接口文件,Mapper文件相对于接口文件的实现)。二级缓存的作用域是同一个nameSpace下的mapper映射文件内容,多个SqlSession共享。

​ 不同 的 sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同即最终执行 相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从 缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis 默认没有开启二级缓存 需要在 setting 全局参数中配置开启二级缓存。

查询的顺序: 二级缓存 => 一级缓存 => 数据库

只能在一个命名空间下使用二级缓存

  • 由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。在多个namespace中若均存在对同一个表的操作,那么这多个namespace中的数据可能就会出现不一致现象。

在单表上使用二级缓存

如果一个表与其它表有关联关系,那么久非常有可能存在多个namespace对同一数据的操作。而不同namespace中的数据互补干扰,所以就有可能出现多个namespace中的数据不一致现象。
查询多于修改时使用二级缓存

在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

MyBatis面试:
https://blog.csdn.net/javalingyu/article/details/124739040

猜你喜欢

转载自blog.csdn.net/qq_43483251/article/details/127912241