延迟加载及缓存

延迟加载

  什么是延迟加载:  

    MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置对于主加载对象都是直接执行查询语句的。

  加载时机:  

    直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。

    侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但 当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。

    深度加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

  侵入式延缓存:

       

    Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置侵入式加载

      

       

    不调用主加载对象时只有一条SQL

      

           

    调用主加载对象的信息时会产生两条SQL

      

       

  深度延迟缓存:   

    Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置深度加载

      

       

    调用主加载对象时不会执行第二条加载SQL

      

          

    调用关联对象详细信息时会执行第二次查询

      

      

mybatis缓存

  一级缓存

    一级缓存是基于PerpetualCache(MyBatis自带)HashMap本地缓存,作用范围为session域内,当session flush或者close之后,该session中所有的cache就会被清空。

    缓存的底层实现是一个MapMapkey是查询的依据,使用的ORM框架不同,查询依据也不同,Mybatis查询依据为SQLID+SQL语句,hibernate的为查询结果对象的ID

    

    证明一级缓存的案例

      

      在第一次查询时,走数据库查询,并将数据放入缓存,进行第二次查询时,走缓存查询数据,所以值执行一条SQL;

       

    增删改对缓存的影响:

      

      在一级缓存中,无论是否事务提交,都会重新进行数据库查询;

      事务提交时将一级缓存的数据清空;

      

    结论:     

      一级缓存真实存在,无需配置

      一级缓存的依据是Id+SQL语句;

      增删改会清空一级缓存

  二级缓存  

    二级缓存就是global caching,它超出session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心文件(mybatis-config.xml)settings中设置即可。

    一级缓存的缓存就是SQL语句,二级缓存的缓存是结果对象。  

    pom.xml文件配置:

      <!--引入需要的ehcache插件-->
      <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>1.2.3</version>
      </dependency>
      <!--mybatis整合ehcachejar-->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.0.0</version>
      </dependency>  

    在mybatis-config.xml中开启二级缓存

      <settings>
              <!--开启二级缓存-->
              <setting name="cacheEnabled" value="true"/>
      </settings>   

    在小配置xml文件增加cache节点

         

      <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

    实体实现Serializable(标志接口:没有任何方法)

      

       

    测试:

      

    结果:

        

    增删改对缓存的影响:

      进行事务提交:

        

         

      不进行事务提交:

        

         

  关闭刷新缓存    

    在增删改对应小配置节点内,加入flushCache值为false,默认值为true;

    在select语句中默认值为false,在第一次进行查询时,进行数据库查询,后续相同的查询,就进行缓存查询。、

    

     

  查询不应用缓存

    不应用缓存代表会再次发送SQL查询数据

    

     

     

原文地址:https://www.cnblogs.com/wnwn/p/11671327.html