mybatis缓存的设计
继续用提问的方式来看Mybatis的缓存设计。
1、Mybatis如何开启缓存
Mybatis对查询结果进行缓存,所以缓存的对象为具体的Statement
通过在Statement上是否使用缓存来启用。
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap" fetchSize="5" statementType="PREPARED" useCache="true" >
useCache默认值为true
2、谁持有缓存?
Mybatis中有两个对象持有缓存。
CachingExecutor以及BaseExecutor

CachingExecutor和SimpleExecutor的关系是持有的关系
public class CachingExecutor implements Executor {
private final Executor delegate;
private final TransactionalCacheManager tcm = new TransactionalCacheManager();

3、缓存何时开启?
当开启Mapper级别的缓存时,缓存被开启
缓存是一直开启的
4、缓存何时被命中?

5、缓存清空的时机
①数据库发生变更(update,insert,delete),即使事物没有提交,缓存也失效
②对于相同命名空间Mapper的缓存,多个线程,并发使用相同Mapper的不同语句,任意一个执行事物提交,可导致缓存失效
实际效果:
缓存 会和Mysql的rr隔离级别一致,不会导致幻读(read uncommited)
缓存 在不使用缓存的时候,有效
验证缓存

使用代码验证:
两次查询,只访问了数据库1次.第二次不再请求数据库
一次查询,一次更新(不提交),一次查询.缓存失效,出发了两次数据库查询。

缓存的验证
不配置缓存时,验证不同的sqlSesiion缓存是否通用
触发2次数据库访问
配置缓存参数
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<cache/>

结果出乎意料,缓存竟然没有命中。分析下原因:

即使打开了缓存,首先也是保存在事物级别的缓存里,TransactionalCache里.
只有当实物提交时,才会真正将缓存转移到delegate中(delegate是真正的Mapper之间公用的缓存)
调整代码,后缓存生效。

让人不理解的,出于什么目的,要commit后,再共享?
如果在某一秒,有10个并发共同访问数据库。那他们会同时产生10个连接,并不会命中。
6、Mybatis缓存设计的目的
简单,不配置也可以使用。用与在一个sqlSession中多次使用相同条件多次查询。
7、Mybatis缓存设计的目的
增强版,也支持事物级别的缓存,同时支持不同sqlSession之间的共享。扩大可缓存的可用性。
mybatis缓存的设计的更多相关文章
- mybatis缓存源码分析之浅谈缓存设计
本文是关于mybatis缓存模块设计的读后感,关于缓存的思考,关于mybatis的缓存源码详细分析在另一篇文章:https://www.cnblogs.com/gmt-hao/p/12448896.h ...
- 《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理
<深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分 ...
- 《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现
<深入理解mybatis原理> MyBatis缓存机制的设计与实现 本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存 ...
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...
- 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 如上图所示,当开一个会话时,一个SqlS ...
- MyBatis缓存设计
和大多数ORM框架一样,为了尽可能减少数据库的访问,MyBatis设计支持缓存功能.设计上通过Cache接口提供SPI(服务提供接口),可以让第三方缓存提供具体的缓存实现,比如使用ehcache.Re ...
- Mybatis源码研究7:缓存的设计和实现
Mybatis源码研究7:缓存的设计和实现 2014年11月19日 21:02:14 酷酷的糖先森 阅读数:1020 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- mybatis深入理解(六)-----MyBatis的二级缓存的设计原理
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及 ...
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
作者博客:http://blog.csdn.net/u010349169/article/category/2309433 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简 ...
随机推荐
- JavaSpcript基础
函数 代码的复用:写一遍多次使用>把特定的功能语句打包放在一起 语法:function 名字(0,1,1多个参数){ 执行的语句 } 返回值return,把语句返回给函数 例子: functio ...
- curl传输数据时遇到的问题整理
1.get传参,参数带有空格的传输方式 因为使用get传输的时候,有的参数可能存在有空格,为了避免传输是错误是字符替代“%20” 或者使用函数转译一下参数http_build_query($param ...
- excel 格式化姓名
在做excel时,难免会遇到输入姓名对齐这种情况,如果数据少时我们可以手动敲空格来进行对齐,但数据量大时,手动调整就不是好办法了. 此时我们可以通过excel自带公式对 ...
- NSTimer应用
NSTimer应用 在参与项目开发中遇到了NSTimer的应用,虽然我负责的模块内只用到了一小部分,但我觉得还是有必要拿出来好好琢磨一下. 一.概念(来自官方描述) 官网上最新的定义是“A timer ...
- margin外边距属性
外边距属性: 设置元素与元素之间的距离(外边距),4个方向(上右下左). margin:长度值|百分比|auto margin-top margin-right margin-bottom margi ...
- SQL Server中的连接查询(内连接、外连接、交叉连接)
在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询 连接查询分为三种:内连接.外连接和交叉连接 1. 内连接 内连接inner join ...
- ssh 端口更改或ssh 远程接不上的问题(尤其是国外服务器)
问题: Connecting to 149.*.*.*:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]' ...
- postgresql 最大连接数相关
PG中有一张表记录着当前有多少连接 表名:pg_stat_activity 查询当前连接数: select count(1) from pg_stat_activity; 查询最大连接数 show m ...
- ifconfig中lo、eth0、br0、wlan0接口
在 实体机上 ifconfig 命令用于 显示或配置网络设备(网络接口卡) 或修改. 1. 显示内容分析: lo 回环接口lo Link encap:Local Loopback inet addr ...
- java web(二): servlet的简单使用和介绍
前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet. 一:创建动态web项目 1. 首先切换到javaEE视图. 在ecplise左边即项目管理器哪里右键点击新 ...