【MyBatis框架点滴】——MyBatis一级缓存

简介:   跟Hibernate一样,MyBatis提供了缓存查询(一级缓存和二级缓存)的功能,用于提高数据库性能,减轻数据库压力。


  跟Hibernate一样,MyBatis提供了缓存查询(一级缓存和二级缓存)的功能,用于提高数据库性能,减轻数据库压力。

  如图:

18.png


 一级缓存是SqlSession级别的缓存。在我们利用MyBatis操作数据库时,需要构造SqlSession对象,在对象中有一个HashMap的数据结构用于存储缓存数据,而且不同的SqlSession之间的缓存数据互不影响。



一级缓存的应用

 下面在代码中试验一下,MyBatis默认已经开启了一级缓存,所以不需要任何配置。这里只贴上测试的code


 实验一:


@Test
public void testCache1() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  // 查询id为1的用户
  User user1 = userMapper.selectByPrimaryKey(6);
  System.out.println(user1.getUsername());
  // 查询id为1的用户
  User user2 =userMapper.selectByPrimaryKey(6);
  System.out.println(user2.getUsername());
  sqlSession.close();
}


  日志:

19.png


  由日志中可以看到,当在同一个session中连续查找两条相同的数据时,只执行了一条查询语句。

// 测试一级缓存
@Test
public void testCache1() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  // 查询id为1的用户
  User user1 = userMapper.selectByPrimaryKey(6);
  System.out.println(user1.getUsername());
  // 更新id为1的用户
  user1.setUsername("Danny");
  userMapper.updateByPrimaryKey(user1);
  sqlSession.commit();
  // 查询id为1的用户
  User user2 =userMapper.selectByPrimaryKey(6);
  System.out.println(user2.getUsername());
  sqlSession.close();
}


 日志:


20.png



 这里第二次查询与第一次查询仍然是相同的数据,但在第二次查询之前,先进行了更新操作,于是第二次查询去一级缓存中并没有查到数据,所以转而去数据库中查找数据。



总结

 在上面的实验中,第一次查询到的数据已经被存放在一级缓存中,当再次查询的时候,会先去一级缓存中查找该数据,如果有则直接返回,没有的话才去数据库中查询。而且当SqlSession进行任何增删改的操作(即改变数据)时,会清空一级缓存中的数据,并且由于一级缓存是SqlSession级别的,所以SqlSession关闭后,一级缓存也会被清空。如下图:


21.png


  MyBatis和Spring整合后,通常将事务控制在service中,此时在service中,方法开始执行时,开启事务,创建SqlSession对象,调用结束时,SqlSession自动关闭。

  在同一个service中可能包含多个mapper的操作,比如:

 userMapper.selectByPrimaryKey(6);//第一次调用mapper方法
 //……其他业务逻辑
 userMapper.selectByPrimaryKey(6);//第二次调用mapper方法


  这时在同一个service中查询相同用户信息,就会用到一级缓存,因为方法调用结束,SqlSession就会关闭,一级缓存就会清空。但如果是在两个service中查询相同的用户信息,就不会使用一级缓存了,这时可以使用二级缓存(详见下篇文章)。

相关文章
|
2月前
|
存储 缓存 NoSQL
mybatisplus一二级缓存
MyBatis-Plus 继承并优化了 MyBatis 的一级与二级缓存机制。一级缓存默认开启,作用于 SqlSession,适用于单次会话内的重复查询;二级缓存需手动开启,跨 SqlSession 共享,适合提升多用户并发性能。支持集成 Redis 等外部存储,增强缓存能力。
|
2月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
260 0
|
4月前
|
缓存 Java 数据库连接
Mybatis一级缓存详解
Mybatis一级缓存为开发者提供跨数据库操作的一致性保证,有效减轻数据库负担,提高系统性能。在使用过程中,需要结合实际业务场景选择性地启用一级缓存,以充分发挥其优势。同时,开发者需注意其局限性,并做好事务和并发控制,以确保系统的稳定性和数据的一致性。
139 20
|
6月前
|
缓存 Java 数据库连接
Mybatis一级缓存、二级缓存详讲
本文介绍了MyBatis中的查询缓存机制,包括一级缓存和二级缓存。一级缓存基于同一个SqlSession对象,重复查询相同数据时可直接从缓存中获取,减少数据库访问。执行`commit`操作会清空SqlSession缓存。二级缓存作用于同一namespace下的Mapper对象,支持数据共享,需手动开启并实现序列化接口。二级缓存通过将数据存储到硬盘文件中实现持久化,为优化性能,通常在关闭Session时批量写入缓存。文章还说明了缓存的使用场景及注意事项。
195 7
Mybatis一级缓存、二级缓存详讲
|
6月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
366 16
Redis应用—8.相关的缓存框架
|
10月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
579 0
|
6月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
353 29
|
7月前
|
缓存 Java 数据库连接
十、MyBatis的缓存
十、MyBatis的缓存
126 6
|
6月前
|
Oracle 关系型数据库 Java