zoukankan      html  css  js  c++  java
  • 延迟加载和缓存

    一、延迟加载

      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、二级缓存在增删改的情况下,如果提交事务则会清空缓存重新查询,如果不提交则获取缓存数据。

        

         

     

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/tinghao/p/11672712.html
Copyright © 2011-2022 走看看