博客
关于我
浅谈MyBatis缓存
阅读量:346 次
发布时间:2019-03-04

本文共 2883 字,大约阅读时间需要 9 分钟。

MyBatis 缓存机制解析

MyBatis 是一款流行的ORM框架,其默认配置提供了一级和二级缓存机制。通过合理配置这些缓存,可以显著提升应用程序的性能。本文将从一级缓存和二级缓存两个方面展开分析,并简要讨论第三方缓存(如ehcache)的使用方法。

一级缓存

MyBatis 的一级缓存是默认开启的,作用范围限于同一个 SqlSession 对象。其主要功能是缓存 mapper 接口方法调用的结果,避免重复执行相同的数据库查询。

示例代码解析:

public static void query() throws IOException {    Reader reader = Resources.getResourceAsReader("conf.xml");    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);    SqlSession session = sessionFactory.openSession();    StudentMapper studentMapper = session.getMapper(StudentMapper.class);    Student3 student1 = studentMapper.queryStudentByStuno(1);    Student3 student2 = studentMapper.queryStudentByStuno(1);    System.out.println(student1.getStuNo() + "," + student1.getStuName());    System.out.println(student2.getStuNo() + "," + student2.getStuName());    session.close();}

在以上代码中,student1student2 是从同一个 SqlSession 中获取的 StudentMapper 实例,因此它们共享相同的缓存。通过日志可以看到,只执行了一条 SQL 语句,这表明一级缓存有效地避免了重复查询。

缓存清除:

如果需要清除一级缓存,可以通过 session.commit() 方法执行。这一点在上述代码中得到了验证:在 session.commit() 之后,执行相同的查询会触发两次数据库查询,缓存被清空。

二级缓存

与一级缓存不同,二级缓存的配置需要手动开启,且其作用范围基于相同的命名空间(namespace)。要实现二级缓存,需要完成以下配置步骤:

  • 核心配置文件设置:

    打开 mybatis-config.xml,在 <settings> 标签下添加以下配置:

  • Mapper 接口配置:

    在对应的 mapper.xml 文件中启用二级缓存,可以通过添加 <cache> 标签:

    如果需要针对特定查询禁用二级缓存,可以在 select 标签中添加 useCache="false" 属性。

  • 实体类序列化:

    为确保二级缓存正常工作,需要确保使用的实体类(如 Student3)实现 Serializable 接口。此外,级联属性也需进行序列化处理。

  • 二级缓存的使用示例:

    public static void query() throws IOException {    Reader reader = Resources.getResourceAsReader("conf.xml");    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);    SqlSession session = sessionFactory.openSession();    StudentMapper studentMapper = session.getMapper(StudentMapper.class);    Student3 student3 = studentMapper.queryStudentByStuno(2);    session.close();    // 第二次查询    SqlSession session2 = sessionFactory.openSession();    StudentMapper studentMapper2 = session2.getMapper(StudentMapper.class);    Student3 student4 = studentMapper2.queryStudentByStuno(2);    session2.close();    System.out.println(student3.getStuNo() + "," + student3.getStuName());    System.out.println(student4.getStuNo() + "," + student4.getStuName());}

    在上述代码中,虽然 session1session2 是不同的 SqlSession 对象,但它们获取的 StudentMapper 实例共享同一个命名空间,因此可以正常使用二级缓存。

    缓存清除方法:

    二级缓存的清除操作与一级缓存类似,需执行增删改操作的 commit()。此外,若在 select 标签中设置 flushCache="true",可以实现自动清除缓存。

    第三方缓存(ehcache)

    ehcache 是 MyBatis 官方推荐的第三方二级缓存解决方案。其配置相对简单,主要步骤如下:

  • 导入必要 jar 文件:

    - Ehcache-core.jar- Mybatis-ehcache.jar- Self-api.jar
  • 配置 ehcache.xml:

    创建或修改 ehcache.xml 文件,通常放在 src/main/resources 目录下。示例配置如下:

  • 更新 mapper.xml:

    mapper.xml 中启用 ehcache 缓存:

  • 注意事项:

    • 实体类需实现 Serializable 接口,特别是包含级联属性的类。
    • ehcache 的配置需要确保 ehcache.jar 和相关依赖已正确导入项目。
    • 二级缓存的命名空间需与 MyBatis 的命名空间一致,否则可能导致缓存不命中。

    通过以上配置,可以有效提升 MyBatis 应用程序的性能,减少数据库查询压力。对于复杂的实体类或大数据量的查询,推荐结合一级和二级缓存使用,或者采用 ehcache 等第三方缓存解决方案。

    转载地址:http://ryhe.baihongyu.com/

    你可能感兴趣的文章
    ng 指令的自定义、使用
    查看>>
    Nginx
    查看>>
    nginx + etcd 动态负载均衡实践(二)—— 组件安装
    查看>>
    nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
    查看>>
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx Lua install
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 常用配置清单
    查看>>