mybatis一级缓存

mybatis一级缓存

缓存概念
存在于内存中的临时数据
为什么要使用缓存
使用mybatis缓存,减少和数据库的交互次数 提高执行效率
缓存的使用范围
经常查询并且不经常改变的 数据的正确与否对最终结果影响不大
1) 一级缓存的工作机制
同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中
key: hashCode+查询的Sql Id+编写的sql查询语句+参数

mybatis一级缓存
它指的是mybatis中sqlsession对象的缓存
当我们执行查询之后 查询的结果会同时存入到sqlsession为我们提供的一块区域中,该区域的结构是一个map,当我们再次查询同样的数据 mybatis会先去sqlsession中查询是否有,有的话直接拿出来使用,当sqlsession对象消失时候,mybatis的一级缓存也就消失了

1
2
3
4
5
6
7
8
public LsjmUser getUser() {
// 第一次查询
LsjmUser user = lsjmUserMapper.getUserByName("300");
System.out.println(user.toString());
// 第二次查询
LsjmUser user1 = lsjmUserMapper.getUserByName("300");
System.out.println(user1.toString());
return user;

从日志信息可以很明显的看到,代码中的两次查询构建了两个SqlSession对象,也就是说第二次查询并没有从前一次的SqlSession缓存中获取,而是自己新建一个SQLSession对象,重新查询,,看似,mybatis的一级缓存失效了?
这是因为:
spring 中 结合 mybatis中,默认情况下,数据库处于自动提交模式,每一条sql语句处于一个单独的事务中,语句执行完毕时,如果执行成功则隐式提交事务。而mybatis的一级缓存在这种情况下是无效的,想要一级缓存起作用,则要开启事务:
开启事务:spring使用ThreadLocal获取当前资源绑定同一个SQLSession
未开启事务:每次查询,spring关闭旧的SslSession,创建一个新的Sqlsession对象,一级缓存不起作用

1
2
3
4
5
6
7
8
9
10
@Transactional // 开启事务控制,当前,spring配置文件中得先配置好
public LsjmUser getUser() {
// 第一次查询
LsjmUser user = lsjmUserMapper.getUserByName("300");
System.out.println(user.toString());
// 第二次查询
LsjmUser user1 = lsjmUserMapper.getUserByName("300");
System.out.println(user1.toString());
return user;
}

可以看出来第一次查询时,构造了一个SqlSession对象,从数据库查询数据,然后将查询的结果存储到一级缓存SqlSession中,

第二次查询时,直接Fetched SqlSession,而不是再重新建一个,此时就是从缓存中直接取数据了

实际应用:
正式开发,是将mybatis和spring进行整合开发,事务控制在service中。一个service方法中包括很多mapper方法调用。

1
2
3
4
5
6
service{
//开始执行时,开启事务,创建SqlSession对象
//第一次调用mapper的方法findUserById(1)
//第二次调用mapper的方法findUserById(1),从一级缓存中取数据
//方法结束,sqlSession关闭
}

怎么保持数据的一致性
当调用修改 添加删除 commint close方法时候就会清空一级缓存

 

posted @   __破  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示