MyBatis缓存
一级缓存
本地缓存,SqlSession级别(或者说线程级别)的缓存,默认存在的。
机制
只要之前查过的数据(比如根据id查一个员工),都会默认保存在缓存中(Map),下次再取就直接拿(不会再发SQL语句)
失效的几种情况
不同的SqlSession使用不同的缓存,当不同的sqlsession调用同一个方法同一个参数时,不能共享。
在同一个sqlsession会话中的两次查询中间有任何一次增删改操作时,就会清空缓存,重写发SQL语句。
openSession.clearCache()方法,手动清空缓存。
二级缓存
全局范围的缓存,namespace级别,除过当前线程,SqlSession能用之外,其他也能用,默认不开启。
全局配置文件中setting标签里cacheEnabled属性调为true,开启全局缓存开关。
SQL映射文件中,写一个cache空标签即可开启该文件的二级缓存。
最后让bean对象实现序列化接口,就可以用了。
cache标签属性

查询顺序
每一个mapper有一个二级缓存,每一个sqlsession有一个一级缓存。
不会出现一级缓存和二级缓存有同一个数据,二级缓存是一级缓存关闭了才有数据,一级缓存只有在二级缓存没有数据才看,如果也没有就去看数据库,查出来放入一级缓存。
当发起一个sqlsession,调用mapper里的查询方法查询一号员工时,先查这个mapper的二级缓存,没查到数据。再查这个sqlsession的一级缓存,也没有,再查数据库。查到后,存入一级缓存中,在这个sqlsession没关闭时再查一号员工时,直接从一级缓存中取数据,如果又有一个新的sqlsession查找一号员工,也是这个顺序。当sqlsession关闭后,会将一级缓存中的数据存入二级缓存,这是如果有新的sqlsession查询一号员工,直接从二级缓存中取数据。
所以任何时候都是优先看二级缓存,再看一级缓存,再查数据库。
缓存设置

整合EHCache
MyBatis开放了Cache接口
cache标签的type属性写ehcache包下的EhcacheCache
省略
总结
头发-1