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架构:

相关推荐
jnrjian4 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
TTc_4 天前
oracle中的union和union all有什么区别?
数据库·oracle
知我Deja_Vu4 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存
山峰哥4 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
莫寒清4 天前
Mybatis的插件原理
面试·mybatis
南 阳4 天前
Python从入门到精通day37
数据库·python·oracle
没有bug.的程序员4 天前
电商秒杀系统深度进阶:高并发流量建模、库存零超卖内核与 Redis+MQ 闭环
数据库·redis·缓存·高并发·电商秒杀·流量建模·库存零超卖
轩情吖4 天前
MySQL库的操作
android·数据库·mysql·oracle·字符集·数据库操作·编码集
troublea4 天前
ThinkPHP3.x高效学习指南
mysql·nginx·缓存
troublea4 天前
ThinkPHP6快速入门指南
数据库·mysql·缓存