延迟加载和缓存

半腔热情 提交于 2019-12-01 09:46:42

一、延迟加载

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

 

    

     

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!