Mybatis的二级缓存

这篇具有很好参考价值的文章主要介绍了Mybatis的二级缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 缓存的概述和分类
 

  概述
 

  缓存就是一块内存空间.保存临时数据
 

  为什么使用缓存  

  将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取的时候 ,直接从缓存中获取,可以减少和数据库交互的次数,这样可以提升程序的性能!
 

  缓存的适用情况  

  适用于缓存的:经常查询但不经常修改的(eg: 省市,类别数据),数据的正确与否对最终结果影响不大的

  不适用缓存的:经常改变的数据 , 敏感数据(例如:股市的牌价,银行的汇率,银行卡里面的钱)等等
 

  MyBatis缓存类别  

  一级缓存:它是sqlSession对象的缓存,自带的(不需要配置)不可卸载的(不想使用还不行). 一级缓存的生命周期与sqlSession一致。

  二级缓存:它是SqlSessionFactory的缓存。只要是同一个SqlSessionFactory创建的SqlSession就共享二级缓存的内容,并且可以操作二级缓存。二级缓存如果要使用的话,需要我们自己手动开启(需要配置的)。
 

  二级缓存的使用  

  1.在 mybatis的核心配置文件中开启二级缓存

    <!--**因为 cacheEnabled 的取值默认就为 true**,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。  -->
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

  2.在Dao映射文件中配置使用二级缓存

<?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.itheima.dao.UserDao">
    <!--配置二级缓存-->
    <cache/>
   
    <select id="findAll" resultType="user">
        select * from t_user
    </select>

    <delete id="deleteById" parameterType="int">
        delete from t_user where uid=#{id}
    </delete>
</mapper>

  3.要进行二级缓存的Pojo类必须实现Serializable接口

public class User implements Serializable {
    private int uid;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    // 省略setter,getter,构造...等方法
}

  4.测试使用二级缓存
 

  - 测试代码

@Test
      public void testFindAll() throws Exception{
          // 1.加载mybatis核心配置文件
          InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
 
          // 2.创建SqlSessionFactoryBuilder对象
          SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
 
          // 3.构建SqlSessionFactory对象
          SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
 
          // 4.获取SqlSession对象
          SqlSession sqlSession = sqlSessionFactory.openSession();
 
          // 5.获得dao接口的代理对象
          UserDao userDao = sqlSession.getMapper(UserDao.class);
 
          // 6.执行sql语句,得到结果
          List<User> list = userDao.findAll();
          for (User user : list) {
              System.out.println("user = " + user);
          }
          sqlSession.close();//清除一级缓存
 
          System.out.println("分割线----------------------------------");
 
          SqlSession sqlSession2 = sqlSessionFactory.openSession();
          UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
          List<User> userList2 = userDao2.findAll();
          for (User user : userList2) {
              System.out.println(user);
          }
          // 7.释放资源
          sqlSession2.close();
      }

  - 测试结果:

Mybatis的二级缓存

  - 经过上面的测试,我们发现执行了两次查询,并且在执行第一次查询后,我们关闭了一级缓存,再去执行第二次查询时,我们发现并没有对数据库发出 sql 语句,所以此时的数据就只能是来自于我们所说的二级缓存。
 

  5.测试关闭二级缓存
 

  - 测试代码

   @Test
      public void testFindAll() throws Exception{
          // 1.加载mybatis核心配置文件
          InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
 
          // 2.创建SqlSessionFactoryBuilder对象
          SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
 
          // 3.构建SqlSessionFactory对象
          SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
 
          // 4.获取SqlSession对象
          SqlSession sqlSession = sqlSessionFactory.openSession();
 
          // 5.获得dao接口的代理对象
          UserDao userDao = sqlSession.getMapper(UserDao.class);
 
          // 6.执行sql语句,得到结果
          List<User> list = userDao.findAll();
          for (User user : list) {
              System.out.println("user = " + user);
          }
          sqlSession.close();//清除一级缓存
 
          System.out.println("分割线----------------------------------");
 
          SqlSession sqlSession2 = sqlSessionFactory.openSession();
          UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
          userDao2.deleteById(5);// 关闭二级缓存
 
          List<User> userList2 = userDao2.findAll();
          for (User user : userList2) {
              System.out.println(user);
          }
          // 7.释放资源
          sqlSession2.close();
      }

  - 测试结果

  

Mybatis的二级缓存

  - 经过上面的测试,我们发现执行了两次查询,并且在执行第一次查询后,我们关闭了一级缓存,关闭二级缓存,再去执行第二次查询时,我们发现对数据库发出了 sql 语句,所以此时的数据是来自数据库,不是缓存。
 

  总结
 

  - 二级缓存的使用小结:

  - 1.开启二级缓存

  - 2.dao映射文件配置二级缓存

  - 3.要进行二级缓存的Pojo类必须实现Serializable接口

  - 4.使用二级缓存:它是SqlSessionFactory的缓存。只要是同一个SqlSessionFactory创建的SqlSession就共享二级缓存的内容

  - 5.关闭二级缓存文章来源地址https://www.toymoban.com/news/detail-411137.html

到了这里,关于Mybatis的二级缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis缓存和二级缓存整合Redis

    缓存验证 在⼀个sqlSession中,对user表根据username进⾏两次查询,查看他们发出sql语句的情况 查看控制台打印情况: 看控制台输出可以看出来,第一次执行了SQL查询,第二次直接打印的结果集,没有查询数据库。 同样是对user表进⾏两次查询,只不过两次查询之间进⾏了⼀次

    2024年02月06日
    浏览(59)
  • Mybatis的二级缓存

    缓存的概述和分类   概述   缓存就是一块内存空间.保存临时数据   将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取的时候 ,直接从缓存中获取,可以减少和数据库交互的次数,这样可以提升程序的性能!   适用于缓存的:经常查询但不经常修改的(eg: 省市

    2023年04月12日
    浏览(38)
  • Mybatis一级缓存和二级缓存(带测试方法)

    目录 相关导读 一、什么是缓存  二、Mabtis一级缓存 (1)测试一级缓存

    2023年04月08日
    浏览(78)
  • mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

    分类 : 使用Limit,来进行分页;物理分页 使用RowBounds集合来保存分页需要数据,来进行分页;逻辑分页;本质是全查,只是显示部分 使用分页插件来进行分页;物理分页 方式一: 方式二: 方式三: 首先导入两个jar包: 配置插件: 调用: 字段 含义 pageNum 当前页的页码 pa

    2024年01月18日
    浏览(53)
  • Mybatis的一级、二级缓存怎样使用?

    一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。 二级缓存是基于namespace和mappe的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储 当某一个作用域

    2024年02月16日
    浏览(42)
  • Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存&二级缓存

    缓存越小,查询速度越快,缓存数据越少 缓存越大,查询速度越慢,缓存数据越多 在多级缓存中,一般常见的是先查询一级缓存,再查询二级缓存,但在Mybatis中是先查询二级缓存,再查询一级缓存。 在Mybatis中,BaseExecutor属于一级缓存执行器,CachingExecutor属于二级缓存执行

    2024年02月14日
    浏览(43)
  • mybatis的一级二级缓存详解及源码解剖

    一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。一级缓存是MyBatis默认开启的,可以通过在SqlSession中调用clearCache()方法来清空缓存。 二级缓存是指在多个Sq

    2024年02月05日
    浏览(52)
  • MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

    什么是缓存? 1.存在内存中的临时数据 2.将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库 数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存 减少和数据库的交互次数,减少系统开

    2024年02月09日
    浏览(39)
  • CaffeineCache+Redis 接入系统做二层缓存思路实现(借鉴 mybatis 二级缓存、自动装配源码)

    现在手上有个系统写操作比较少,很多接口都是读操作,也就是写多读少,性能上遇到瓶颈了,正所谓前人栽树、后人乘凉,原先系统每次都是查数据库的,性能比较低,如果先查 redis,redis 没数据再查数据库的话,但是还可以更快,那就是使用内存查询,依次按照内存、

    2024年02月09日
    浏览(42)
  • Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

    Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果。 本篇博客将介绍如何使用Spring-Boot快速搭建一

    2024年01月17日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包