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

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。

大家好,又见面了,我是你们的朋友全栈君。

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

MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存:

       一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改);

       二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个Application应用。

  

  MyBatis中一级缓存和二级缓存的组织如下图所示:

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

 一级缓存的工作机制:

      一级缓存是Session会话级别的,一般而言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。关于一级缓存的详细实现,我已经在《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项 一文中有非常详尽的讨论,读者可以前去了解。

二级缓存的工作机制:

       如上所言,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了”cacheEnabled=true“,那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。

     MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis自己定义的二级缓存实现;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如Memcached等,这个我们会在后续的文章中详细讨论。

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

由于缓存机制东西太多,所以将缓存机制的叙述拆成一下几部分(读者可点击查看):

1. MyBatis的一级缓存实现详解 及使用注意事项

2. MyBatis的二级缓存的设计原理

3. 自定义二级缓存(未完,待续)

4. 使用第三方内存库作为MyBatis的二级缓存(未完,待续)

作者的话

    本文是《深入理解mybatis原理》系列的其中一篇,如果您有兴趣,请关注该系列的其他文章~

   觉得本文不错,顺手点个赞哦~~您的鼓励,是我继续分享知识的强大动力!

   如果您觉得有不妥或者错误的地方,还请您不吝指教!

 

 

—————————————————————————————————————————————–

                                                                本文源自  http://blog.csdn.net/luanlouis/,如需转载,请注明出处,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143156.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • excel多列合并关联数据[通俗易懂]

    excel多列合并关联数据[通俗易懂]假设现在有三张表第一张第二张第三张姓名与操作id相对应,现在想弄出这样的一个表,将多列数据整合起来那怎么做呢?需要用到函数vlookup这个查找值是合并时不变的那列,在这个案例下,就是指日期+姓名+操作id这三列,但是这里是不能写这么多的,只能是一列的第一个值,作为查找值,应该是像主键一样具有唯一的id。第一步,将三列合并为一列,需要用到函数concatenate公式

    2022年7月17日
    16
  • 桌面虚拟化管理员必备工具Boomerang

    桌面虚拟化管理员必备工具Boomerang

    2021年8月15日
    80
  • linux系统下安装软件的命令(在linux下安装win系统)

    rabbitMq是用erlang分布式语言开发的,故需先安装erlang下载erlang的tar包:erlang下载首先连接到linux,切换至root用户,并cd至usr/local目录下,在该目录下使用如下命令新建erlang文件夹cd/usr/locallsmkdirerlang使用如下命令给文件夹授权//给local赋予读写权限chmod777local/…

    2022年4月11日
    77
  • 简单介绍一下spring bean的生命周期_java类的生命周期

    简单介绍一下spring bean的生命周期_java类的生命周期1.springbean生命周期2.Aware接口2.1.作用一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;2.2.常用接口ApplicationContextAware:获取ApplicationContextspring上下文;ApplicationEventPublisherAware:获取ApplicationEventPublisher事件发布器;BeanClassLoaderAware:获取当前的ClassLoader类加载器;BeanFac

    2025年11月23日
    3
  • 永远用小的结果集驱动大的结果集

    永远用小的结果集驱动大的结果集

    2021年9月13日
    107
  • ctpn详解

    ctpn详解一.概述对于复杂场景的文字识别,首先要定位文字的位置,即文字检测。这一直是一个研究热点。文本检测可以看成特殊的目标检测,但它有别于通用目标检测.在通用目标检测中,每个目标都有定义好的边界框,检测出的bbox与当前目标的groundtruth重叠率大于0.5就表示该检测结果正确.文本检测中正确检出需要覆盖整个文本长度,且评判的标准不同于通用目标检测,具体的评判方法参见(ICDAR2017…

    2025年8月21日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号