mybatis一级缓存
缓存概念
存在于内存中的临时数据
为什么要使用缓存
使用mybatis缓存,减少和数据库的交互次数 提高执行效率
缓存的使用范围
经常查询并且不经常改变的 数据的正确与否对最终结果影响不大
1) 一级缓存的工作机制
同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中
key: hashCode+查询的Sql Id+编写的sql查询语句+参数
mybatis一级缓存
它指的是mybatis中sqlsession对象的缓存
当我们执行查询之后 查询的结果会同时存入到sqlsession为我们提供的一块区域中,该区域的结构是一个map,当我们再次查询同样的数据 mybatis会先去sqlsession中查询是否有,有的话直接拿出来使用,当sqlsession对象消失时候,mybatis的一级缓存也就消失了
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对象,一级缓存不起作用
@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方法调用。
service{ //开始执行时,开启事务,创建SqlSession对象 //第一次调用mapper的方法findUserById(1) //第二次调用mapper的方法findUserById(1),从一级缓存中取数据 //方法结束,sqlSession关闭 }
怎么保持数据的一致性
当调用修改 添加删除 commint close方法时候就会清空一级缓存
标签:缓存,一级,查询,SqlSession,mybatis,LsjmUser From: https://www.cnblogs.com/popopopopo/p/16982723.html