Mybatis-一级缓存和二级缓存
区别:
一级缓存的作用域是一个sqlsession内;
二级缓存作用域是针对mapper进行缓存;
一级缓存
Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。
当参数和SQL完全相同的情况下,我们会使用同一个SqlSession对象调用同一个Mapper方法。
当第1次执行SQL语句后,MyBatis会自动将其放在缓存中。
后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。
清空缓存
一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。
提示:以下是本篇文章正文内容,下面案例可供参考
二级缓存
Mybatis的二级缓存是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询数据的节点需要配置useCache=“true”,并且,查询返回的结果类型必须是实现了Serializable接口的!另外,当缓存 了数据后,如果执行了当前XML中配置的增、删、改操作,会自动刷新此前的缓存数据!
关于二级缓存的特点还有许多,例如Mybatis使用了LRU算法来管理缓存的数据,但是,由于Mybatis的缓存在一定程度上是不可控的,所以,在实际应用中,一般并不使用Mybatis的缓存机制来实现数据缓存,而是使用自定义的缓存机制,或第3方缓存服务器,例如Redis、MemCache等!
如测试sql语句性能时缓存会影响测试准确性 需要禁用在映射文件中:默认值是true useCache=”false”
Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
-
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
-
原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。