JavaEE Mybatis(三)一级缓存与二级缓存
1. 缓存的使用
用户可以将查询到的实体类放到缓存中,使后面的 select 得以复用,这会提高程序的运行效率。
MyBatis 缓存分为一级缓存和二级缓存。
(一)一级缓存由 SqlSession 对象管理,每个 SqlSession 有自己所属的一级缓存。
(二)二级缓存由 SqlSessionFactory 对象管理,是 Application 级别。
2. 一级缓存
一级缓存是 MyBatis 默认提供并开启的,每个 SqlSession 都有自己所属的一级缓存。
创建一个 session 对象如下:
SqlSession session = factory.openSession();
Userinfo userinfo1 = session.selectOne("getUserinfoById", 4L);
Userinfo userinfo2 = session.selectOne("getUserinfoById", 4L);
//输出信息
运行结果显示 Session 只执行了一次 sql 语句查询。
说明在同一个 SqlSession 中复用了 Userinfo 对象。
但不同的 SqlSession 对象缓存中的数据不可以共享。
因此如果想实现不同 SqlSession 缓存中的数据可以共享,那么需要使用二级缓存。
3. 二级缓存
创建二级缓存只需要在 SQL 映射文件中添加配置代码
<cache></cache>
在 SQL 映射文件中使用了该配置后具有如下两个特性。
(1)当为 select 语句时:flushCache 默认为 false,表示任何时候语句被调用,都不会清空本地缓存和二级缓存,因为查询操作并没有将数据进行更改,不需要刷新缓存中的数据。useCache 默认属性为 true,表示会将当前 select 语句查询的结果放入二级缓存中。
(2)当为 insert、update、delete 语句时:flushCache 默认为 true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空,因为数据被更改了。
具体实现代码如下:
SqlSession session1 = factory.openSession();
SqlSession session2 = factory.openSession();
Userinfo userinfo1 = session1.selectOne("getUserinfoById");
//输出调用
session1.commit();
session1.close();
//注意:在查询完 userinfo1 之后要将 sqlsession1 进行提交和关闭
//目的是将 userinfo1 对象放入二级缓存中,以备让新的 sqlsession2 对象从二级缓存中复用对象
Userinfo userinfo2 = session2.selectOne("getUserinfoById");
//输出调用
session2.commit();
session2.close();
运行结果显示不同的 SqlSession 对象可以共享二级缓存中的实体类。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具