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

        

         

     

  • 相关阅读:
    伟景行 citymaker 从入门到精通(2)——工程图层树加载
    伟景行 citymaker 从入门到精通系列
    伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件
    Android手机屏幕投射到电脑神器Vysor
    GeoTools坐标转换(投影转换和仿射变换)
    微信开发系列(1):企业号回调模式认证
    通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法
    SDE ST_Geometry SQL st_intersects查询很慢的解决方法
    axTE3DWindowEx双屏对比控件白屏解决方法以及网上方法的校正(CreateControlOveride)
    namespace使用方法
  • 原文地址:https://www.cnblogs.com/tinghao/p/11672712.html
Copyright © 2011-2022 走看看