mybatis的一级和二级缓存,mybatis一级缓存的作用范围

  mybatis的一级和二级缓存,mybatis一级缓存的作用范围

  Java面试经常会问到Mybatis的一级缓存和二级缓存。今天我给大家详细讲解一下Mybatis一级缓存和二级缓存的原理和区别。

  Mybatis缓存是内存中的数据,往往来自于保存数据库查询结果。使用缓存可以避免与数据库的频繁交互,从而提高查询响应速度。

  MyBatis提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:

  让我们大致了解一下麦巴蒂斯L1缓存和麦巴蒂斯L2缓存:

  一级缓存:SqlSession级缓存,缓存的数据只在SqlSession中有效。

  二级缓存:映射器级缓存。同一个命名空间共享这个缓存,因此它是为SqlSession共享的。二级缓存需要手动打开。

  下面我们来详细解释一下两者的原理和区别。Mybatis一级缓存1。为什么需要Mybatis一级缓存?当我们使用Mybatis操作数据库时,我们会创建一个SqlSession来进行数据库会话,并在会话结束时关闭SqlSession对象。

  如果我们很可能多次查询完全相同的sql语句,每次查询一次数据库,那么查询数据库的成本会比较高,导致系统资源的浪费。

  为了解决这个问题,Mybatis在每个会话中加入了缓存操作,每次都需要查询数据库,而不需要相同的SQL。这就是Mybatis一级缓存的作用。

  2.mybatis一级缓存的实现。我们知道SqlSession的操作。MyBatis通过执行程序在内部执行,执行程序的生命周期与SqlSession的生命周期一致。

  Mybatis在Executor中创建一个本地缓存(一级缓存),如下图所示:

  一般流程如下:第一次查询用户id信息,先检查是否存在于缓存中;如果没有,则从数据库中查询用户信息,获取用户信息后将用户信息存储在一级缓存中。

  如果sqlSession执行提交操作(insert、update、delete),则清除sqlSession中的一级缓存,确保缓存中始终保存最新的信息,避免脏读。

  第二次,查询缓存中的用户id信息。如果缓存中有,直接从缓存中获取。

  注意:两个查询必须在同一个sqlsession中完成,否则不会取mybatis的一级缓存。

  当mybatis与spring集成时,事务控制在服务中进行。重复调用servcie两次不会占用一级缓存,因为当session方法在第二次调用中结束时,SqlSession就会关闭。

  3.Mybatis一级缓存配置mybatis一级缓存的范围包括会话和语句,默认为会话。

  如果不想使用一级缓存,可以将一级缓存的作用域指定为语句,这样每次执行Mapper中的一条语句,一级缓存都会被清除。

  如果需要改变一级缓存的范围,可以通过下的localCacheScope在Mybatis的配置文件中指定。

  设置name= localcachescope value= statement /Mybatis L2缓存1。你为什么需要我的巴蒂斯L2缓存?MyBatis L1缓存的最大共享范围是在一个SqlSession内,所以如果多个SQL session需要共享缓存,就需要打开L2缓存。

  2.2的实施。我的巴蒂斯L2缓存。L2缓存打开后,CachingExecutor将用于修饰执行器。在进入L1缓存的查询流程之前,会在CachingExecutor中查询L2缓存。具体工作流程如下图所示。

  L2缓存打开后,同一命名空间的所有操作语句都影响同一个缓存,即L2缓存由多个SqlSession共享,是一个全局变量。

  当打开缓存时,数据查询执行的过程是L2缓存-L1缓存-数据库。

  MyBatis默认关闭L2缓存,因为如果频繁添加和删除,L2缓存每次都会是空的。

  Mybatis的一级缓存和二级缓存的区别1)一级缓存Mybatis的一级缓存是指SQLSession,作用域是SQL Session,MyBits默认打开一级缓存。

  在同一个SqlSession中,执行同一个SQL查询时;第一次您将查询数据库并将其写入缓存,第二次您将直接从缓存中获取它。当执行SQL时,如果两个查询之间有添加、删除和更改,SQLSession的缓存将被清除。

  每次查询都会先去缓存。如果找不到,就去数据库查询,然后把结果写入缓存。Mybatis内部缓存使用的是HashMap,关键是hashcode statementId sql语句。值是由查询结果集映射的java对象。SqlSession在执行insert、update、delete等操作后,提交后会清空SQLSession缓存。

  2)默认情况下,Mybatis L2缓存是不打开的,它作用于一个应用程序。它是映射器级别的,使用同一映射器的多个SqlSession可以使用L2缓存。

  版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: