延迟加载和缓存(终极)

延迟:

  MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候

  按照设置延迟加载规则推迟对关联对象的select检索

  延迟加载可以有效的减少数据库 的压力。

  MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的(两条select语句)

注意:

  延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询

 

三种延迟:

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

  侵入式延迟加载:执行对主加载对象查询时,不会执行关联对象的查询,若访问主加载对象详情时立即执行关联对象的查询

  深度式延迟加载:执行对主加载对象查询时,不会执行关联对象的查询,若访问关联对象详情时立即执行关联对象的查询

侵入式延迟加载案例:

  

  

   

   

   

   

   

 深度式延迟加载案例

  

  

   

   

   

 缓存:

  好处:

    使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互

    尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。

  

MyBatis查询缓存机制:

  根据缓存区的作用域与生命周期,可划分两种

    一级缓存

    二级缓存

MyBatis缓存的作用域

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

生命周期:

   但是SqlSession对象一旦关闭,SqlSession对象就不存在了,即一级缓存就不存在了

  二级缓存的生命周期与整个应用同步

一级缓存测试:

  

  

   

 增删改对一级缓存的影响  

  

   

  

   

 总结:

     一级缓存在增删改的情况下,无论是否提交事务,都会重新发送SQL,并清除缓存

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

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

二级缓存测试:

  .xml文件

  

   entity

  

   

   

   

   

  增删改对一级缓存的影响

   

   

 总结:

  二级缓存需要手动开启

  二级缓存即使关闭了SqlSession也能使用

  如果一个select标签想要局部关闭二级缓存,需要设置useCache=false

  

  如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false

  

   

原文地址:https://www.cnblogs.com/whtt/p/11672120.html