继续用提问的方式来看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缓存的设计的更多相关文章

  1. mybatis缓存源码分析之浅谈缓存设计

    本文是关于mybatis缓存模块设计的读后感,关于缓存的思考,关于mybatis的缓存源码详细分析在另一篇文章:https://www.cnblogs.com/gmt-hao/p/12448896.h ...

  2. 《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

    <深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分 ...

  3. 《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现

    <深入理解mybatis原理> MyBatis缓存机制的设计与实现 本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存 ...

  4. 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

    本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...

  5. 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 如上图所示,当开一个会话时,一个SqlS ...

  6. MyBatis缓存设计

    和大多数ORM框架一样,为了尽可能减少数据库的访问,MyBatis设计支持缓存功能.设计上通过Cache接口提供SPI(服务提供接口),可以让第三方缓存提供具体的缓存实现,比如使用ehcache.Re ...

  7. Mybatis源码研究7:缓存的设计和实现

    Mybatis源码研究7:缓存的设计和实现 2014年11月19日 21:02:14 酷酷的糖先森 阅读数:1020   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  8. mybatis深入理解(六)-----MyBatis的二级缓存的设计原理

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及 ...

  9. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

    作者博客:http://blog.csdn.net/u010349169/article/category/2309433 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简 ...

随机推荐

  1. phoneshop cs6破解

    一.以“试用”方式安装photoshop: 二.下载amtlib.dll破解文件,密码:ubx2: 三.备份photoshop目录下的amtlib.dll文件,将下载的amtlib.dll文件拷贝到p ...

  2. linux学习笔记2 - linux常用命令

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...

  3. 图解HTTPS协议

    原文出处: leezhong的博客 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实 ...

  4. web渗透学习方向

    本章写给新加入我们破晓工作室的学弟学妹. 我现在写的是渗透方向的学习方向.因为我参加了线上培训班,听了专门培训渗透的课程后.所以感觉我们工作室自学太累了.如果没有一个“正确”的学习方向都不知道该学些什 ...

  5. Django 数据迁移

    在1.6之前, Django只支持添加新的model到数据库, 而无法编辑或修改已经存在的model. 在当时, 这些Django缺失的功能可以通过South实现. 1. 新的命令 Django 1. ...

  6. Dubbo的三种连接方式

    1.采用zookeeper作为注册中心 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...

  7. 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言

    Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...

  8. Setting

    http://www.cnblogs.com/felixwang2/p/8798653.html

  9. Nginx failing to load CSS and JS files (MIME type error)

    Nginx failing to load CSS and JS files (MIME type error) Nginx加载静态文件失败的解决方法(MIME type错误) 上线新的页面,需要在n ...

  10. Python importlib(动态导入模块)

    使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...