0%

MyBatis慨耻

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