一级缓存:SqlSession

mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求,那么直接从内存中读数数据而不是从数据库读取。

SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder来构建SqlSessionFactory实例,一旦创建了 SqlSessionFactory,就不再需要SqlSessionFactoryBuilder 了,当然可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例。

SqlSessionFactory: 每个MyBatis集成的应用都是以一个SqlSessionFactory实例为中心,一旦被创建就应该在应用的运行期间一直存在。使用 SqlSessionFactory 是在应用运行期间不需要创建多次,有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession:SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它用于请求或方法范围。不能将 SqlSession 实例的引用放在一个类的静态域,或者一个类的实例变量。应用每次收到客户端一个 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,然后关闭它。

在spring mvc 架构中,每次请求都会客户端的请求都会通过控制层(controller)进入业务层(service),在业务层不加事务的情况下,如果是调用个mapper接口执行数据库操作,则每次请求都会创建一个SqlSession去操作数据库。

一级缓存使用场景:
在service层多次请求同一个mapper接口操作数据库,并且每次请求的参数不变,则第一次执行后就会触发一级缓存的使用,不再执行sql去查询数据库,直接读取缓存的数据。

对SqlSession执行Commit操作,也就是对数据库执行了update、delete、insert等操作,会清除一级缓存保存数据的HashMap结构数据,用户在发起查询请求时就会重新读取数据并放入一级缓存中了。

每次查询回去缓存中查找,如果找不到会去数据库查询,然后把查询结果写入缓存中。Mybatis内部使用HashMap结构存储缓存数据,key为hashCode + statementId + sql 语句,value 为查询出来的结果集映射成的java对象。

当MyBatis与spring整合后,如果没有事务,一级缓存是失效的。解决该问题的办法有两种途径:
有两种途径:
1.添加事务
2.使用二级缓存

二级缓存:Namespace

二级缓存的作用域是一个namespace。但并不是意味着同一个namespace的mapper接口可以互相读取缓存内容,如果开启了二级缓存,那么在关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。

开启二级缓存:
1.打开二级缓存总开关

<settings><setting name="cacheEnabled" value="true"/>
</settings>

2.打开mapper的二级缓存开关
在mapper文件加入:

</cache>

3.涉及二级缓存mapper操作的实例对象需要实现Serializable接口。

默认sqlsession提交事务后会关闭,并且会刷新缓存数据,如果在select 标签加入 flushCache=“false” 则会禁止刷新,或者配置mapper 文件的<cache flushInterval=“1000”/ > 属性,定期刷新缓存。

Mybatis一级缓存、二级缓存相关推荐

  1. Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启:Mybatis的二级缓存,指的是SqlSession ...

  2. mybatis一级,二级缓存。缓存带来的脏读问题

    title 1. 关于缓存的介绍 2. 一级缓存,默认开启,session级别 3. 二级缓存,mapper 的namespace级别 1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个Sq ...

  3. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  4. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)

    查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...

  5. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  6. 【mybatis】Mybatis中的一级、二级缓存

    [mybatis]简介 [mybatis]mybatis & mybatis-plus & hibernate的区别 [mybatis]核心成员分析 [mybatis]Mybatis的 ...

  7. 【MyBatis学习13】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

  8. MyBatis中的二级缓存

    MyBatis中的二级缓存 1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二 ...

  9. MyBatis学习系列——二级缓存

    [MyBatis学习13]MyBatis中的二级缓存 发表于2016/6/16 7:26:19  4922人阅读 分类: ● 框架技术 --[MyBatis] 1. 二级缓存的原理 前面介绍了,myb ...

  10. 【MyBatis学习8】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

最新文章

  1. linux下的CPU频率管理器
  2. 微软私有云分享(R2)7-Linux虚拟机无DNS?
  3. Receiver ED、Link quality indicator (LQI)、Clear channel assessment (CCA)究竟是什么?802.15.4标准
  4. 致远表单代办状态删除
  5. Boost: 检查underlying_type特性是否有效的测试程序
  6. SAP CRM Business Partner API的buffer工作原理
  7. PAT_B_1053_Java(20分)
  8. php grepmatch,linux最快的文本搜索神器ripgrep(grep的最好代替者)
  9. easyui combobox 左匹配模糊查询
  10. ^_^直接用脚本分割日志,不用工具。
  11. 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则
  12. 刷paper利器!不想打开PDF,这个插件自动帮你转到介绍页
  13. 【Luogu 3389】【模板】高斯消元法(用高斯消元求解线性方程组)
  14. 分分钟搞定 OpenV2X 开发环境
  15. matlab中值滤波器
  16. 全国耳鼻喉科 医院排名
  17. Diabetes Care:西湖大学郑钜圣等机器学习揭示影响2型糖尿病的肠道菌群特征
  18. Import “github.com/gogo/protobuf/gogoproto/gogo.proto“ was not found or had errors.
  19. 安卓开机画面_【电视技术】索尼液晶电视开机横线,图像上下跳动技改方案
  20. 干货分享,大型国企项目管理经验分享

热门文章

  1. OA实施成功率提升,流程梳理是关键
  2. 国产奶粉冲击高端,飞鹤、蒙牛、合生元们的牌好不好打?
  3. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
  4. python字典类型实现的键值对的映射_python数据类型-映射和集合-字典
  5. 数学不好的人可以学python吗_哪些人适合学金融工程专业 数学不好能学吗
  6. 定义一个列表存储n个整数,求列表的长度,最大值,最小值和平均值
  7. mysql数据库没启动命令_mysql数据库服务启动和停止命令介绍(转载)
  8. php入门时间,PHP入门(8)日期和时间
  9. Python中字典get方法的使用
  10. Python练习题:计算平均分