当前位置:首页 > 经验 >

mybatis一级缓存和二级缓存(mybatis一级缓存和二级缓存的关系)

来源:原点资讯(www.yd166.com)时间:2022-10-29 11:57:14作者:YD166手机阅读>>

mybatis一级缓存和二级缓存,mybatis一级缓存和二级缓存的关系(1)

mybatis缓存机制

mybatis包含缓存机制,恶意方便的配置和定制。

默认定义了一级缓存和二级缓存。

  • 默认情况下,只有一级缓存开启(sqlSession级别的缓存,也称本地缓存)
  • 二级缓存需要手动开启和配置,是基于namespace级别的缓存(全局缓存)
  • 为了提高扩展性。Mybatis定义了缓存接口Cache,可以通过实现Cache接口来自定义二级缓存
一级缓存

与数据库同义词会话期间查询到的数据会放在本地缓存中,以后获取相同的数据,只需要从缓存中取,没必要查数据库

一级缓存失效的情况
  • sqlSession不同
  • sqlSession相同,查询条件不同(此时该数据在一级缓存中还没有)
  • sqlSession相同,但是在两次查询之间执行了增删改操作(这次增删改可能会对当前数据有影响)
  • sqlSession相同,手动清除了一级缓存 session.clearCache()
二级缓存

一个namespace对应一个二级缓存,不同namespace查出的数据会放在不同的map中

开启二级缓存后,会使用CacheExecutor来装饰Executor,在查询数据时,先查询二级缓存,二级缓存没有再去查一级缓存

二级缓存的使用

开启全局二级缓存配置

<settings> <!-- 开启二级缓存,默认为true --> <setting name="cacheEnabled" value="true"/> </settings>

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

<!-- eviction: 缓存回收策略 - LRU 最近最少使用:移除最长时间不被使用的,默认 - FIFO 先进先出,按照对象进入缓存的顺序移除 - SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象 - WEAK 弱引用,积极地移除基于垃圾收集器状态和弱引用规则的对象 flushInterval: 缓存刷新间隔 缓存多长时间清空一次,默认不清空,单位毫秒 readOnly 默认false - true 只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。mybatis为了加快获取速度, 直接将数据在缓存中的引用交给用户,速度快,但是不安全 - false 非只读,mybatis会认为获取到的数据可能会被修改,会利用序列化和反序列化机制克隆一份新的数据 size: 缓存多少元素 type: 指定自定义缓存的全类名,需要实现Cache接口 blocking: 若缓存中找不到对应的key,是否会一直阻塞,知道对应的数据进入缓存 --> <cache eviction="FIFO" flushInterval="60000" readOnly="true" size="1024"/>

由于可能会用到序列化和反序列化,所以使用缓存的对象要实现序列化接口(readOnly为false的时候需要用到序列化和反序列化)

否则会报java.io.NotSerializableException异常

注意:一定要在同一个sqlSessionFactory下的不同sqlSession下使用二级缓存,如果为不同的sqlSessionFactory,永远不可能命中二级缓存的(我测试的时候就犯糊涂了,找了半天配置的问题才反应过来)

@Test public void testTwoLevelCache(){ SqlSession session = sqlSessionFactory.openSession(); // mybatis为接口创建代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.selectUser(8); System.out.println(user); userMapper.updateUser(user); session.close(); SqlSession session1 = sqlSessionFactory.openSession(); UserMapper userMapper1 = session1.getMapper(UserMapper.class); User user1 = userMapper1.selectUser(8); System.out.println(user1); System.out.println(user == user1); session1.close(); } 二级缓存失效的情况

  • 如果第一个sqlSession没有提交,第二个sqlSeesion是无法命中二级缓存中该数据的,(sqlSession提交的时候才会将数据存入到二级缓存)
  • 两次查询之间包含了增删改操作(在增删改操作时默认会刷新缓存,导致缓存失效)
缓存相关配置总结
  • 全局配置文件settings中配置 cacheEnabled=true 该配置只影响二级缓存,对于一级缓存没有影响
  • 每个select标签都有useCache="true" 默认为true,该配置只影响二级缓存,对于一级缓存没有影响
  • 每个增删改标签都有flushCache="true",增删改操作执行后清除缓存,该清除会清除一级和二级缓存,默认true如果在select上使用flushCache="true",则查询不会使用缓存,默认false
  • sqlSession.clearCache() 只是清除一级缓存,不会清除二级缓存
  • 全局配置文件settings中配置localCacheScope 本地缓存作用域(只针对一级缓存),有两个取值SESSION|STATEMENT,默认是SESSION可以使用STATEMENT来禁用一级缓存

栏目热文

mybatis通俗讲解(mybatis中的基础知识和快速入门)

mybatis通俗讲解(mybatis中的基础知识和快速入门)

版权声明:本文为CSDN博主「$码出未来」的原创文章原文链接:https://blog.csdn.net/yuansha...

2022-10-29 11:48:11查看全文 >>

mybatis工作原理通俗易懂(MyBatis从入门到精通)

mybatis工作原理通俗易懂(MyBatis从入门到精通)

废话不多说,直接进入文章。我们在使用Mybatis的时候,会在xml中编写SQL语句。如图:那么,MyBatis底层是如...

2022-10-29 11:36:56查看全文 >>

mybatis框架快速入门(学习mybatis框架需要什么基础教程)

mybatis框架快速入门(学习mybatis框架需要什么基础教程)

MyBatis 框架概述MyBatis 框架:MyBatis 本是apache 的一个开源项目 iBatis, 2010...

2022-10-29 11:32:56查看全文 >>

27道经典mybatis面试题(最经典的35个面试问题)

27道经典mybatis面试题(最经典的35个面试问题)

什么是 Mybatis?MyBatis 的优点MyBatis 框架的缺点MyBatis 框架适用场合MyBatis 与 ...

2022-10-29 12:09:20查看全文 >>

mybatis工作原理及流程(mybatis工作原理及讲解)

mybatis工作原理及流程(mybatis工作原理及讲解)

MyBatis 是 java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,mybatis已经成为...

2022-10-29 11:43:55查看全文 >>

mybatis基础知识整理(mybatis初学者基础知识)

mybatis基础知识整理(mybatis初学者基础知识)

Mybatis简介原始jdbc操作(查询数据)原始jdbc操作(插入数据)原始jdbc操作的分析原始jdbc开发存在的问...

2022-10-29 12:07:42查看全文 >>

mybatisplus优缺点(mybatis优缺点)

mybatisplus优缺点(mybatis优缺点)

在之前发表的文章中有说过mybatis,没看过的可以去看一看,今天来说一说他的升级版本,简而言之,就是mybatis-p...

2022-10-29 11:54:17查看全文 >>

mybatis源码深度解析(mybatis源码详细讲解)

mybatis源码深度解析(mybatis源码详细讲解)

一、前言1、mybatis框架图如上为mybatis的框架图,在这篇文章中通过源码来重点看下数据处理层中的参数映射,SQ...

2022-10-29 12:00:28查看全文 >>

mybatis原理通俗易懂(my batis的工作原理)

mybatis原理通俗易懂(my batis的工作原理)

近来想写一个Mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客...

2022-10-29 11:56:10查看全文 >>

mybatis基本工作流程(mybatis中的基础知识和快速入门)

mybatis基本工作流程(mybatis中的基础知识和快速入门)

1、首先是读取Mybatis的核心配置文件Mybaits-config.xml,该文件主要是配置了数据库的连接信息、用户...

2022-10-29 11:42:24查看全文 >>

文档排行