mybatis缓存主要实现是PerpetualCache。 sql
一级缓存实现: 缓存
BaseExecutor --> localCache参数。
当session.close()的时候会回调Excutor.close方法,从而状况本地缓存,因此一级缓存的生命周期和session同步,并且缓存是经过: session
createCacheKey(ms, parameter, rowBounds, boundSql); localCache.putObject(key, list);
这里直的key的成分包含了sql参数,因此不一样参数相同statement也会发起两次sql,因此这里缓存的也是对象(以前在一个博客上看到博主说是缓存的sql语句,是错误的,,若是看客有疑问或者问题但愿留言告知)。 mybatis
二级缓存: app
须要在mybatis.xml里的settings开启: ui
<setting name="cacheEnabled" value="true"/>这里开启后Configurtion里就会使用CacheExcutor,默认实现也是 PerpetualCache,固然能够在mapper.xml里指定本身的cache,这里使用ehcache的实现。
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>这个cache是经过MapperStatement注入到cacheExcutor的,当调用cacheExcutor.query的时候会注入进去。
当调用session.close的时候只会删除一级缓存,而二级缓存还会放在CacheExcutor.TransactionalCacheManager里面。当调用update的时候会根据isFlushCacheRequired来判断是否须要清除缓存,isFlushCacheRequired在mapper.xml里的sql文里配置flushCache属性。 spa
这里有个疑问:以前看别人博客说只要进行插入更新就会清空二级缓存,但这里的代码是只有指定fushCache为true才会去删缓存,还需看代码才行。。 xml