MyBatis的缓存

Mybatis的一级缓存

一级缓存是++sqlSession++级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问

使一级缓存失效的四种情况:

  1. 不同的SqlSession对应不同的一级缓存
  2. 同一个SqlSession但是查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  4. 同一个SqlSession两次查询期间手动清空了缓存
java 复制代码
SqlSession session = sqlSessionFactory.openSession();

// 第一次查询,缓存为空
User user1 = session.selectOne("com.example.UserMapper.selectUserById", 1);

// 第二次查询,缓存命中
User user2 = session.selectOne("com.example.UserMapper.selectUserById", 1);

// 此时 user1 和 user2 引用的是相同的对象,因为一级缓存命中
assert user1 == user2;

session.close();  // 关闭后一级缓存失效

Mybatis的二级缓存

二级缓存是++SqlSessionFactory++级别,通过同一个SqlSessionFactory创建的SqlSession查询结果会被缓存;此后若再执行相同的查询语句,结果就会从缓存中获取

二级缓存开启的条件:

  1. 在核心配置文件中,设置全局配置属性cacheEnable="true",默认为true,不需要设置
  2. 在映射文件中设置标签<cache/>
  3. 二级缓存必须在SqlSession关闭或提交之后有效
  4. 查询的数据所转换的实体类必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

全局配置

XML 复制代码
<configuration>
    <!-- 启用二级缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

mapper配置

XML 复制代码
<mapper namespace="com.example.UserMapper">
    <!-- 启用二级缓存 -->
    <cache/>
    
    <!-- SQL 映射 -->
    <select id="selectUserById" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

总结

一级缓存 :作用于同一个 SqlSession,默认启用,简单有效。

二级缓存 :作用于整个 Mapper,跨 SqlSession 共享缓存,需要手动启用。

缓存的优势:减少数据库访问次数,提升查询效率。

缓存的使用:合理配置缓存策略,确保数据的一致性和及时更新。

相关推荐
拾-光几秒前
LTX-Video 2.3 实战:用图片生成视频,消费级显卡也能跑的开源 I2V 模型(GPT Image 2)
java·人工智能·python·深度学习·算法·机器学习·音视频
普修罗双战士33 分钟前
高效使用 Git:从入门到精通的实战指南
java·git
wuxinyan12342 分钟前
Java面试题51:一文深入了解K8s 环境下企业级 CI/CD 流水线搭建
java·ci/cd·kubernetes·面试题
琪露诺大湿1 小时前
网页聊天系统——测试报告
java·软件测试·功能测试·websocket·html·项目·测试报告
小园子的小菜1 小时前
生产实战|冷热数据转换:从识别、触发到落地全流程解析
java·开发语言·spring
invicinble1 小时前
对于线程的思路
java
iwS2o90XT1 小时前
WebSocket编程:Java实现实时双向通信应用
java·websocket·网络协议
Highcharts.js1 小时前
技术组合分析:Highcharts 的数据集成能力解析
java·前端·金融·echarts·saas·bi·highcharts
逆境不可逃2 小时前
一篇速通Redis 从原理到Java实战(含缓存问题解决方案+集群配置)
数据库·redis·缓存
shaoFan12 小时前
关于java 调用阿里千问大模型,流式返回,并返回给前端
java·前端·状态模式