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

相关推荐
令人着迷43 分钟前
Redis核心问题总结(一)
数据库·redis·缓存
java6666688881 小时前
Spring Boot与HashiCorp Vault的集成
数据库·spring boot·oracle
啊猪是的读来过倒1 小时前
Redis深度解析:核心数据类型与键操作全攻略
数据库·redis·缓存·核心数据类型·详细操作+案例
G皮T2 小时前
【MyBatis】MyBatis 理论 40 问(二)
java·数据库·spring boot·spring·mybatis·关系映射
续亮~2 小时前
6、Redis系统-数据结构-06-跳表
java·数据结构·数据库·redis·后端·缓存
李长安的博客4 小时前
Oracle PL / SQL update更新数据
数据库·sql·oracle
☀️5 小时前
Redis 的过期策略
数据库·redis·缓存
得不到的更加爱5 小时前
redis并发、穿透、雪崩
数据库·redis·缓存
真果粒wrdms7 小时前
【SQLite3】常用API
linux·服务器·c语言·jvm·数据库·oracle·sqlite
乐安lan13 小时前
数据库的操作
数据库·oracle