一级缓存默认是开启的(但是整合了Spring,Mybatis的一级缓存默认就失效了)
二级缓存是要手动配置开启的(二级缓存是mapper级别的缓存,可以跨SqlSession)
开启二级缓存(xml方式):在*Mapper.xml中加入如下代码
<!--eviction: 清空缓存的策略 readOnly: 是否只读 flushInterval: 每个60秒刷新一次缓存 size: 内存大小,最多存储结果对象或者列表的512个引用 --> <cache readOnly="true" eviction="FIFO" flushInterval="60000" size="512"/>
两种方式二选一,如果都配置会报错:Caches collection already contains value for com.lixianhe.dao.UserMapper
注意:使用Mybatis二级缓存必须是xml写SQL语句,不能使用注解写SQL语句
在开启二级缓存的情况下执行一条sql
select colA1, colA2, colB1, colB2 from A, B where ...
A表执行了上述的sql
B表更新了字段cloB1,colB2
A表再次执行了上述的sql(前提没有执行insert、update、delete)
A表第二次就查询出了脏数据(B表的数据就是脏数据),这个问题对二级缓存来说是一个无解的问题
因此Mybatis二级缓存的使用用一个前提,必须保证所有的增删改查都在同一个namespace下才行
由于二级缓存的弊端,所以并不建议在实际生产中使用,而是在外部实现自己的缓存,如使用Redis做缓存