当前位置:主页 > java教程 > MyBatis一级缓存避坑完全指南

MyBatis一级缓存需要注意的地方

发布:2020-02-01 20:22:46 178


给网友朋友们带来一篇MyBatis相关的编程文章,网友扈鸿彩根据主题投稿了本篇教程内容,涉及到MyBatis、一级缓存、MyBatis一级缓存避坑完全指南相关内容,已被718网友关注,涉猎到的知识点内容可以在下方电子书获得。

MyBatis一级缓存避坑完全指南

一级缓存概念
当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象。那么一个SqlSession的生命周期即对应于Mybatis的一次会话。在Mybatis的一次会话中,我们很有可能多次查询完全相同的sql语句,如果不采取措施的话,每一次查询都查询一次数据库。而一次会话时间一般都是极短的,相同Sql的查询结果极有可能完全相同。由于查询数据库代价是比较大的,这会导致系统的资源浪费。

为了解决这个问题,Mybatis对每一次会话都添加了缓存操作。这个缓存的作用域为一次会话中。缓存随着会话(SqlSession)的创建而产生,随着会话结束而释放。对一次会话的查询操作,总是先查看缓存中是否存在查询结果,如果存在则直接取缓存中的结果,不存在则查询数据库。这样的话,一次会话中的完全相同的查询则只会查询一次,节省了系统资源。

引言

MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选:

package org.apache.ibatis.session;

/**
 * @author Eduardo Macarron
 */
public enum LocalCacheScope {
 SESSION, //session 级别的缓存 STATEMENT //statement 级别的缓存
}

1)session 级别的缓存

在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中。

验证代码:

[

public static void main(String[] args) throws IOException { InputStream inputStream = new ClassPathResource("mybatis.xml").getInputStream(); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); System.out.println(mapper.get(1L)); System.out.println("-------------------"); System.out.println(mapper.get(1L));}

输出:

MyBatis一级缓存避坑完全指南

日志输出可以看到,第一次查询通过数据库查询,第二次则没有,直接通过缓存读取。

坑:这种缓存策略有一个坑,在服务集群时就会出现问题。

假设现在有一个服务集群,有两个节点。

首先,两个节点都进行了同样的查询,两个节点都有自己的一级缓存,后续同样的查询,两个节点将不再查询数据库。

MyBatis一级缓存避坑完全指南

如果此时节点 1 执行了 update 语句,那么节点 1 的一级缓存会被刷新,而节点 2 的一级缓存不会改变。

MyBatis一级缓存避坑完全指南

2)statement 级别的缓存

避坑: 为了避免这个问题,可以将一级缓存的级别设为 statement 级别的,这样每次查询结束都会清掉一级缓存。MyBatis 源码如下:

MyBatis一级缓存避坑完全指南

在 MyBatis 的配置文件中,添加以下配置:

MyBatis一级缓存避坑完全指南

验证代码和上面的一样不变。

输出:

MyBatis一级缓存避坑完全指南

可以看到,即使是同样的查询,每次查询都是直接读取数据库了。

避坑完毕。

缓存是不可能不要缓存的,这个时候,就需要使用缓存中间件了,由缓存中间件管理缓存。

MyBatis一级缓存避坑完全指南

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。


参考资料

相关文章

  • Mybatis常见注解有哪些(总结)

    Mybatis常见注解有哪些(总结)

    发布:2022-06-19

    为网友们分享了关于Mybatis的教程,这篇文章主要介绍了Mybatis常见注解有哪些(总结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Mybatis-plus的selectPage()分页查询不生效问题解决

    发布:2023-03-04

    本文主要介绍了Mybatis-plus的selectPage()分页查询不生效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • MyBatis的mapper.xml文件中入参和返回值的实现

    发布:2023-03-03

    这篇文章主要介绍了MyBatis的mapper.xml文件中入参和返回值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • mybatis-plus在yml中配置详解

    发布:2023-03-23

    本文主要介绍了mybatis-plus在yml中配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法

    发布:2023-04-01

    这篇文章主要给大家介绍了关于MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下


  • MyBatis 核心配置文件及映射文件详解

    发布:2023-03-09

    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,本文重点介绍MyBatis 核心配置文件及映射文件,需要的朋友可以参考下


  • Mybatis-Plus设置全局或者局部ID自增的实现

    发布:2023-03-02

    在使用Mybatis-Plus新增的时候,我们往往想要id随着数据库自增,本文主要介绍了Mybatis-Plus设置全局或者局部ID自增的实现,具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • SpringBoot项目将mybatis升级为mybatis-plus的方法

    发布:2023-03-03

    本文主要介绍了SpringBoot项目将mybatis升级为mybatis-plus的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


网友讨论