一级缓存是sqlsession级别的缓存,默认是存在的。
特性:
* 1.默认就开启了,也可以关闭一级缓存 localCacheScope=STATEMENT
* 2.作用域:是基于sqlSession(默认),一次数据库操作会话。
* 3.缓存默认实现类PerpetualCache ,使用map进行存储的
* 4.查询完就会进行存储
* 5.先从二级缓存中获取,再从一级缓存中获取
key==> hashcode+sqlid+sql
失效情况:
* 1.不同的sqlSession会使一级缓存失效
* 2.同一个SqlSession,但是查询语句不一样
* 3.同一个SqlSession,查询语句一样,期间执行增删改操作
* 4.同一个SqlSession,查询语句一样,执行手动清除缓存
二级缓存是全局作用域缓存,默认是不开启的,需要手动进行配置。Mybatis提供二级缓存的接口以及实现,缓存实现的时候要求实体类实现Serializable接口,二级缓存在sqlSession关闭或提交之后才会生效(事务提交)。
二级缓存:
* 特性:
* 1.默认开启了,没有实现
* 2.作用域:基于全局范围,应用级别。
* 3.缓存默认实现类PerpetualCache ,使用map进行存储的但是二级缓存根据不同的mapper命名空间多包了一层map
* : org.apache.ibatis.session.Configuration#caches key:mapper命名空间 value:erpetualCache.map
一级缓存的key是localCache
* * key==> sqlid+sql
* 4.事务提交的时候(sqlSession关闭)
* 5.先从二级缓存中获取,再从一级缓存中获取
* 实现:
* 1.开启二级缓存
* 2.在需要使用到二级缓存的映射文件中加入
* 3.在需要使用到二级缓存的javaBean中实现序列化接口implements Serializable
* 配置成功就会出现缓存命中率 同一个sqlId: 从缓存中拿出的次数/查询总次数
*
* 失效:
* 1.同一个命名空间进行了增删改的操作,会导致二级缓存失效
* 但是如果不想失效:可以将SQL的flushCache 这是为false,但是要慎重设置,因为会造成数据脏读问题,除非你能保证查询的数据永远不会执行增删改
* 2.让查询不缓存数据到二级缓存中,在select中添加属性useCache="false"
* 3.如果希望其他mapper映射文件的命名空间执行了增删改清空另外的命名空间就可以设置:
*
mapper文件中添加cache的标签属性
eviction="FIFO"
flushInterval="60000"
size="512"
readonly="false"/>



