首页 > 其他分享 >mybatis一级缓存

mybatis一级缓存

时间:2022-12-14 17:36:32浏览次数:29  
标签:缓存 一级 查询 SqlSession mybatis LsjmUser

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

相关文章

  • mybatis-plus的BaseMapper
    顾名思义,BaseMapper就是基础的mapper,我们可以通过继承BaseMapper来实现基础的CRUD功能而无需再写单独的xml文件,这个对于SQL不复杂的场景和表来说非常的友好。基本的使用......
  • Maven构建spring整合mybatis的项目
    1.使用Maven构建java项目,修改pom.xml文件,添加所需的依赖jar包<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:......
  • mybatis的resultType和resultMap
    resultType作为返回值可以是一个基本类型也可以是实体类对象也就是说是一个具体的类如果我们要返回的对象不是一个具体的类假如我们的实体类的属性和数据库的字段不一......
  • mybatis的连接池
    mybatis的连接池连接池:我们在实际开发中都会使用连接池因为它可以减少我们获取连接所消耗的时间连接池就是用于存储连接的一个容器容器其实就是一个集合对象该集合必须......
  • Mybatisplus自动生成SQL语句变成下划线
    ###Errorqueryingdatabase.Cause:java.sql.SQLSyntaxErrorException:Unknowncolumn'l_o_g_i_n_n_a_m_e'in'fieldlist'###Theerrormayexistincom/rqzx/api......
  • 基于Springboot+Mybatis+mysql+vue宠物领养网站1
    @目录一、系统介绍二、功能展示1.主页(普通用户)2.登陆、注册(普通用户)3.宠物大全(普通用户)4.宠物详情(申请领养、点赞、评论)(普通用户)5.我的申请(普通用户)6.个人信息(普通用户......
  • Mybatis学习之实现数据的增删改查(3)
    前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在User.xml 的配置文件中,mappernamespace="com.yihaomen.mybatis.inter.IUserOperation",命名空间非常重......
  • Mybatis学习之实现关联数据的查询(4)
    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创......
  • Mybatis学习之实现mybatis分页(8)
    上一篇文章里已经讲到了mybatis与springMVC的集成,并且做了一个列表展示,显示出所有article列表,但没有用到分页,在实际的项目中,分页是肯定需要的。而且是物理分页,不是内存分......
  • 自定义mybatis框架
    自定义mybatis框架自定义mybatis框架整体思路如下:首先我们需要获取一个输入流然后解析我们的xml主配置文件这里面主要涉及到数据库的连接信息和我们的mapper配置文件信......