注意:此系列源代码分析基于Mybatis 3.5.6,源代码的源代码,源代码仓库地址:Funcy/Mybatis。
本文将从源代码的角度分析Mybatis缓存。
当SQL执行过程前面分析时,将一直遇到两个缓存:
我们仍然是上面文章中的SQL执行过程,作为逐步分析这两个缓存的示例。
让我们输入道路:
此方法有点长,但是我们只需要注意两个地方:
1.1第一个级别的缓存是什么,首先,让我们看看什么是:
这是,我们继续:
它是包装的包装,缓存,采集,删除等的操作,实际上是正确的操作。
在这一点上,我们了解到So -called的第一个-Level CACHE()是一个,并且记录保存在内存中。注意:这是非线程安全性。
1.2第一个级别的缓存的时机在该方法中。如果没有生命缓存,将从数据库中进行检查。让我们看一下数据库的查询过程:
可以清楚地看到该代码。处理QUERY()后,将手动删除第一个级别的缓存()和第一个级别的缓存()。
当然,该操作中有类似的处理缓存操作,因此我不会一个人看到它们。
1.3第一个级别的缓存的范围和第一个级别的缓存中的禁用,缓存数据不是线程-SAFE,因此第一个 - 级别的缓存不是线程-SAFE。它的范围是什么?
通过代码的可追溯性,它是成员变量,并且是成员变量。在先前的分析中,它不是线程的安全性。更合理的方法是为每个线程创建一个新的。在这一点上,可以推断出第一个级别高速缓存()的范围存储在内存中。
因为第一个级别的缓存的范围是第一个缓存的范围,因此可以在使用过程中更新数据库,但是缓存尚未更改。
例如,解释:
首先获得了上述代码,然后从这两个实例获得了两个实例,然后我们使用这两个实例进行操作:
结果如下:
从操作的角度来看,更新是成功的,并且更新后的数据是成功的,但是第二次被发现是更新之前的记录。在第二个查询中,他没有查询数据库,而是获得了直接来自缓存的数据。
从上面的示例中,我们可以看到,在第一个级别的缓存之后,找不到实时数据,并且第一个级别的缓存无法提供外部操作的入口。启用后,它可能会产生严重的后果。那么我们如何关闭呢?
在引入mybatis文档中,一个属性可以解决此问题:
我们在此配置文件中设置:
设置设置后,第一个缓存将不再缓存数据。对此的原则进行确定,您必须返回该方法:
从源代码的角度来看,设置设置后,每个查询都完成,并且将删除缓存。
让我们看一下次要缓存。
2.1创建执行器时打开辅助缓存,创建特定的执行器后,执行器将被缓存:
稍后处理SQL的查询/更新操作时,执行调用,例如查询操作:
这里用于操作次要缓存。默认情况下,次要缓存尚未打开:
可以看出,这意味着未启用次要缓存。因此,您如何使用它?mybatis文档告诉我们启用:
我们添加标签:
当您再次执行查询时,您会发现它不再为空:
2.2配置文档中的辅助缓存,并且辅助缓存中还有其他配置。它也在这里发布:
这些参数没有谈论本文。让我们看一下这些参数正在解析的位置。
当然,该标签是在文件中定义的,我们认为在解析文件时应该解析它。我们输入标签的分析方法:
继续输入该方法:
我们继续进入施工过程:
此方法主要称为构建。我们输入该方法:
默认情况下,缓存的实现类是装饰默认缓存和实例化后。如果配置了参数,则将使用装饰:
该功能是定期清理缓存。在操作时,它将判断是否需要超时。
实施和装饰员如下:
可以看出,真正的认识仅是,其余的都是装饰品。
让我们看一下:
由于装饰层,有很多层次。底层是这是一项真正的工作。它是界面。
我们继续研究该操作:
此步骤的操作是保存它。注意,该类型是稍微查看其定义:
那是子类。
此步骤的结果如下:
在获得此步骤之后,稍后分析该陈述时,将获得的当前所获得的目录放入对象中,并将相关操作分析为一种方法。
2.3回到方法,处理方法如下:
您可以看到,在获得它后,将其用于操作,让我们输入相关方法:
关于它,它也是一个实现类:
该课程实现以下功能:
2.4使用上述分析中的自定义辅助缓存,为每个()创建一个缓存对象(默认实现类是)。EHT对应于缓存对象。
次要缓存的默认实现是查看其内容:
从代码来看,它维护一个命名成员变量。它是类型,缓存//等都在操作此操作,第二个级别的缓存也存储在内存中!
线程不是安全的。我们可以在多线程环境()中使用辅助缓存的默认实现吗?答案还可以。尽管线程不安全,但是在缓存装饰之后,第二级高速缓存的操作是线程的安全。这是信用:
它只是将关键字添加到//和其他操作方法的操作方法中。至于表演,呵呵。
为了更好地播放辅助缓存的功能,开发人员可以自定义辅助缓存的实现:
请注意,如果您使用自定义缓存,则配置将不会生效,这可以反映在方法中:
自定义缓存时,我们可以使用Redis等分布式缓存来存储数据,这里不再有分析。
2.5第二个缓存将何时分析次级缓存?在哪些情况下,适合使用辅助缓存(默认实现)?
从以前的分析中,次要缓存的默认实现具有以下特征:
结合上述,提供的第二级高速缓存仅适用于架子 - 单位和非征收要求不高时使用。
应当指出,上述条件是针对所提供的次要缓存实现的。我们还可以自定义辅助缓存,以达到其分布式和高并发环境的条件。
3.1 Mybatis配置文件中的CCHECA配置摘要,有一个节点,以下配置为:
这个开口还是关闭哪个缓存?
让我们回到路:
这是节点下的值。从视图,当它是为其时,它将不会创建,但它用于处理第二级高速缓存。这样,就无法使用第二个缓存。即使在中间添加了标签,也无法使用辅助缓存。
可以使用该级别的缓存吗?从先前的分析来看,次要缓存的操作位于中间,因此不会受到此处的影响。
3.2 Mybatis缓存比较会话内存的第一级,或者全局内存是否较低(默认)全局内存较低。3.3合理使用Mybatis缓存如何合理使用缓存?我给出的建议是:
本文中的原始链接:https://my.oschina.net/funcy/blog/4952677,仅限于作者的个人级别,文章中有不可避免的事情,欢迎使用CROCKE!请与作者联系以获取业务重印。请指示非商业重印的来源。
原始:https://juejin.cn/post/7102811317605498894