Mybatis 中的一级,二级缓存 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/22 09:58:19 2023/08/22
【摘要】 Mybatis 中的一级缓存和二级缓存是用于提高数据库访问性能的机制。 一级缓存是指在同一个 SqlSession 中,执行相同的查询语句时,Mybatis 会将查询结果缓存起来。这样,当再次执行相同的查询时,Mybatis 会直接从缓存中取出结果,而不需要再次访问数据库。一级缓存是默认开启的,它的生命周期与 SqlSession 一致。 二级缓存是指在多个 SqlSession 中,执行相...

Mybatis 中的一级缓存和二级缓存是用于提高数据库访问性能的机制。 一级缓存是指在同一个 SqlSession 中,执行相同的查询语句时,Mybatis 会将查询结果缓存起来。这样,当再次执行相同的查询时,Mybatis 会直接从缓存中取出结果,而不需要再次访问数据库。一级缓存是默认开启的,它的生命周期与 SqlSession 一致。 二级缓存是指在多个 SqlSession 中,执行相同的查询语句时,Mybatis 会将查询结果缓存起来。这样,当再次执行相同的查询时,Mybatis 会先从二级缓存中查找,如果存在缓存结果,则直接返回,而不需要再次访问数据库。二级缓存是需要手动配置的,可以配置在 Mybatis 的配置文件中,并且可以配置使用哪种缓存实现。 一级缓存和二级缓存的区别在于范围和生命周期。一级缓存的范围是 SqlSession,生命周期是和 SqlSession 一致;而二级缓存的范围是 Mapper,生命周期是和应用程序一致。 需要注意的是,尽管缓存可以提高查询性能,但也可能导致数据不一致的问题。因此,在使用缓存时,需要根据具体的业务需求来进行配置和管理,以保证数据的准确性。

​下面是一个示例代码,演示了如何使用 Mybatis 中的一级和二级缓存: 首先,创建一个 User 实体类:

javaCopy codepublic class User {
    private Long id;
    private String name;
    // 省略其他属性、构造方法和 getter/setter 方法
}

接下来,创建一个 UserMapper 接口,定义查询用户的方法:

javaCopy codepublic interface UserMapper {
    User getUserById(Long id);
}

然后,创建一个 UserMapper.xml 文件,配置对应的 SQL 语句:

xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

接下来,配置 Mybatis 的配置文件,开启二级缓存,并指定缓存实现类:

xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <typeAliases>
        <typeAlias type="com.example.entity.User" alias="User"/>
    </typeAliases>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

最后,使用如下代码进行测试:

javaCopy codepublic class Main {
    public static void main(String[] args) {
        // 创建 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 创建 SqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            // 获取 UserMapper 对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 第一次查询,会从数据库中获取数据
            User user1 = userMapper.getUserById(1L);
            System.out.println(user1);
            // 第二次查询,会从一级缓存中获取数据
            User user2 = userMapper.getUserById(1L);
            System.out.println(user2);
            // 关闭一级缓存,再次查询,会从数据库中获取数据
            sqlSession.clearCache();
            User user3 = userMapper.getUserById(1L);
            System.out.println(user3);
            // 关闭 SqlSession,再次查询,会从二级缓存中获取数据
        }
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user4 = userMapper.getUserById(1L);
            System.out.println(user4);
        }
    }
}

以上代码演示了如何使用 Mybatis 中的一级和二级缓存。在第一次查询时,会从数据库中获取数据,并将结果缓存到一级缓存中;在第二次查询时,会直接从一级缓存中获取数据。当清除一级缓存后,再次查询时,会从数据库中获取数据,并将结果缓存到一级缓存中。在关闭 SqlSession 后,再次打开一个新的 SqlSession,查询时会从二级缓存中获取数据。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。