• 延迟加载和缓存


    一、延迟加载

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

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

        侵入式延迟的配置:

          (1)配置mybatis-config.xml文件

            在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置lazyLoadingEnabled

            

          (2)小配置文件中select语句必须为两条

            

          (3)Test测试类

            

          (4)执行结果如下(当不掉用对象中的字段或属性时只执行一条SQL)

            

            当调用其属性时执行的结果如下

              

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

        深度延迟的配置:

          (1)配置mybatis-config.xml文件,在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置aggressiveLazyLoading

          

           (2)Test测试类

             

              当不调用对象时执行结果如下

            

            当调用其中对象时执行结果如下

              

     二、缓存

      1、为什么使用缓存 

        查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。

      2、缓存说明  

        MyBatis查询缓存的作用域是根据映射文件的namespace划分的,相同的namespacemapper查询数据放在同一个缓存区域。不同namespace下的数据互不干扰。

        无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。

        一级、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。换句话说,一级缓存是在同一线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。

      3、一级缓存

        (1)当同一个会话(SqlSession)执行两条相同SQL语句的时候,控制台只发送一条SQL

         

        

        (2)增删改对一级缓存的影响

          在Dao层中添加update修改方法

            

           Test测试类

            

    import com.user.dao.ISmbmsRoleDao;
    import com.user.entity.SmbmsRoleEntity;
    import com.user.entity.SmbmsUserEntity;
    import com.user.util.mysyutil;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    public class CollectionTest {
        @Test
        public void getRoleAndUserTest(){
            SqlSession sqlSession = mysyutil.getSqlSession();
            ISmbmsRoleDao mapper = sqlSession.getMapper(ISmbmsRoleDao.class);
            SmbmsRoleEntity role = mapper.getRoleAndUser(3);
    
    
            //当不调用字段时,只执行一条SQL语句
           System.out.println("角色:"+role.getRoleName());
    
    
          /* for (SmbmsUserEntity user: role.getUserList()){
                System.out.println("	用户:"+user.getUserName());
            }*/
    
    
            System.out.println("================================修改的方法=====================================");
            mapper.UpdataList(3);
            sqlSession.commit();
    
    
            System.out.println();
            System.out.println("====================一级缓存证明存在=======================");
    
    
            SmbmsRoleEntity role2=mapper.getRoleAndUser(3);
            System.out.println(role2.getRoleName());
    
    
            sqlSession.close();
        }
    }

         运行结果如下

          

         (3)一级缓存总结

          MyBatis框架天然集成一级缓存

          一级缓存查询依据为SQLID+SQL语句

          增删改会清空一级缓存

      4、二级缓存

        (1)在大配置文件中添加二级缓存节点,默认为开启

          

         (2)在小配置文件中添加<cache/>节点,默认走二级缓存

          

         (3)在实体类中实现Serializable接口

          

         (4)Test测试类(只走一条SQL语句)

          

        (5)增删改也会对二级缓存发生影响,会清除SqlSession中的数据重新加载

          

           执行结果如下

            

     三、一级缓存和二级缓存的总结

      1、一级缓存在增删改情况下,无论是否提交事务(SqlSession)都会重新执行数据库查询(清空缓存);

      2、二级缓存在增删改的情况下,如果提交事务则会清空缓存重新查询,如果不提交则获取缓存数据。

        

         

     

  • 相关阅读:
    Bzoj4627 [BeiJing2016]回转寿司
    Bzoj1901 Zju2112 Dynamic Rankings
    COGS728. [网络流24题] 最小路径覆盖问题
    Bzoj4568 [Scoi2016]幸运数字
    Bzoj2728 [HNOI2012]与非
    HDU4609 3-idiots
    Bzoj2194 快速傅立叶之二
    Bzoj2179 FFT快速傅立叶
    模拟52 题解
    模拟51 题解
  • 原文地址:https://www.cnblogs.com/tinghao/p/11672712.html
Copyright © 2020-2023  润新知