• 【JavaEE】之MyBatis查询缓存


      为了减轻数据压力,提高数据库的性能,我们往往会需要使用缓存。MyBatis为我们提供了一级缓存和二级缓存。

      (1)一级缓存是SqlSession级别的缓存,在操作数据库的时候需要创建一个SqlSession,其中有一个HashMap,用于存储缓存数据。不同的SqlSession之间,其缓存数据的HashMap是不同的;

      (2)二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的SQL语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。

      MyBatis的一级缓存和二级缓存的结构如下图所示:

    1、一级缓存

      我们通过一个例子来理解一级缓存,如下图所示:
      (1)当我们第一次查询ID为1的用户信息时,先去缓存中查找缓存中是否缓存有ID为1的用户信息,发现没有,则去数据库中查询,并将查询结果存储到缓存中;
      (2)第二次查询ID为1的用户信息时,去缓存中查找,发现有缓存的数据,因此从缓存中直接取出数据使用;
      (3)如果对数据库中的数据进行了修改、添加或删除操作并执行了commit之后,会清空一级缓存中的数据(这样做的目的是为了让缓存中存储的永远是最新的数据,避免脏读);
      (4)当我们第三次查询ID为1的用户时,先去缓存中查找,如果有则取出来直接用,如果没有则从数据库中查询,然后重新缓存到缓存中。
      MyBatis默认支持一级缓存,不需要在配置文件中进行配置。

    2、二级缓存

      二级缓存的原理与一级缓存的原理相似,都是有则取出来直接使用,无则从数据库中查询出来后存储到缓存中,如果中途进行了commit操作则清空缓存。其基本流程如下图所示:
      MyBatis中的二级缓存默认是关闭的,如果我们想要使用二级缓存,则需要对其进行配置:
      (1)在SqlMapConfig.xml文件中配置二级缓存的总开关,代码如下:
    <settings>
        <!-- 开启二级缓存(默认是开的,这里写出来是为了方便代码维护) -->
        <setting name="cacheEnabled" value="true" />
    </settings>
      (2)在XXXMapper.xml文件中开启二级缓存,代码如下:
    <!-- 开启本mapper所在namespace的二级缓存 -->
    <cache />
      (3)如果想要对某个POJO中的数据进行二级缓存,则需要将其序列化:让这个POJO类实现Serializable接口(这样做的原因是因为二级缓存的数据存储介质是多种多样的,不一定只在内存中,也可能在硬盘中,甚至是远程传输,因此我们将其序列化,以便将来对其进行反序列化)。
      通过以上三个步骤的操作,我们就完成了二级缓存的配置,在XXXMapper这个Mapper中的所有数据就都绑定了二级缓存机制。
      如果我们的某个SQL语句不需要进行二级缓存,但这个SQL所在的Mapper已经配置了二级缓存,那么我们只需要在这个statement上设置useCache属性为false,就可以关闭这个SQL语句的二级缓存,代码如下:
    <select id="selectOrderUserType" resultType="bean_order_user_type" useCache="false">
      当然,MyBatis之所以默认不开启二级缓存,是因为二级缓存有一定的局限性。试想,一个数据表中存储着上亿条数据,如果我们开启了二级缓存,那么这上亿条数据就都存储到了二级缓存中,现在如果我们对其中的一条数据进行了修改并commit提交,那么这上亿条数据就被清空出缓存了,即有时候使用二级缓存的命中率极低。这种情况也是有解决方案的,就是使用一些比较优秀的缓存框架,或使用三级缓存。
     
  • 相关阅读:
    (转)Android 升级 ADT 之后报错之一 case语句 .
    myeclipse CTRL+1功能
    (转)项目延期原因及应对之道
    shiro的使用2 灵活使用shiro的密码服务模块
    shiro的使用1 简单的认证
    最全的 eclipse web 项目目录结构以及Tomcat的各个目录的作用
    Eclipse导入git上的maven web项目 以及部署成功运行
    eclipse中怎么导入git库下载下来的web项目
    git和github的关系以及简单易懂的理解
    LINUX 怎么实现root和普通用户的切换及怎么更改root密码
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211357.html
Copyright © 2020-2023  润新知