Mybatis框架的缓存

Mybatis框架的缓存

一.为什么使用缓存

缓存(cache)的作用是为了减去数据库的压力,提高查询性能。缓存实现的 原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库 执行select语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

二.缓存类型

Mybatis 有一级缓存和二级缓存。一级缓存的作用域是同一个SqlSession, 在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库 中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查 询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存 也就不存在了。Mybatis默认开启一级缓存。 二级缓存是多个SqlSession共享的,其作用域是同一个namespace,不同的 sqlSession 两次执行相同namespace下的sql语句且向sql中传递参数也相同 即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存 (内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。 Mybatis 默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

三.缓存的使用

1.一级缓存:

Mybatis 对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓 存,一级缓存只是相对于同一个SqlSession而言。 所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调 用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询 后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新, 并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再 次发送SQL到数据库。

工作模式:

2.二级缓存:

二级缓存是SqlSessionFactory级别的,根据mapper的namespace划分 区域的,相同namespace的mapper查询的数据缓存在同一个区域,如果使 用mapper代理方法每个mapper的namespace都不同,此时可以理解为二 级缓存区域是根据mapper划分。 每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数 据写入缓存。Mybatis内部存储缓存使用一个HashMap,key为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的java对象。 sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区 域,防止脏读。

二级缓存工作模式:

配置二级缓存配置:

第一步:启用二级缓存 在SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为true时启用二级缓存,设置为false时禁用二级缓存。 第二步:对象序列化 将所有的POJO类实现序列化接口Java.io.Serializable。 第三步:配置映射文件 在Mapper映射文件中添加,表示此mapper开启二级缓存。 当SqlSeesion 关闭时,会将数据存入到二级缓存.

Mybatis:

xml 复制代码
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

Mapper:

xml 复制代码
        <!--
           设置二级缓存配置的
           size=""缓存对象数量
           flushInterval=""设置二级缓存有效时间   毫秒单位
           eviction="FIFO"  firstinfirstout先入先出 配置到期后淘汰策略
        -->
    <cache size="20" flushInterval="3000"></cache>

四.Mybatis架构:

相关推荐
悟空打码3 小时前
MyBatis源码解读5(3.1、缓存简介)
缓存·mybatis
多多*4 小时前
Java反射 八股版
java·开发语言·hive·python·sql·log4j·mybatis
码农飞哥4 小时前
互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
java·数据库·spring boot·缓存·微服务·消息队列·面试技巧
Auc245 小时前
OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
java·spring cloud·log4j·mybatis·代理模式·工厂模式
scdifsn5 小时前
动手学深度学习12.4.硬件-笔记&练习(PyTorch)
pytorch·笔记·深度学习·缓存·内存·硬盘·深度学习硬件
alpha xu7 小时前
Qwen智能体qwen_agent与Assistant功能初探
数据库·人工智能·python·oracle·智能体·千问agent
寻找沙漠的人9 小时前
Redis 缓存
数据库·redis·缓存
文牧之10 小时前
Oracle 通过 ROWID 批量更新表
运维·数据库·oracle
LLLLLindream10 小时前
Redis——达人探店
数据库·redis·缓存
佛祖让我来巡山11 小时前
【Java持久层技术演进全解析】从JDBC到MyBatis再到MyBatis-Plus
mybatis·jdbc·mybatisplus·持久层框架