mybatis缓存

Posted 笨神Fany

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis缓存相关的知识,希望对你有一定的参考价值。

mybatis提供查询缓存,用于减轻数据库压力,提高性能。

一级缓存

一级缓存是sqlSession级别的,不同sqlSession之间的缓存数据区域相互不影响。在构造session对象时使用HashMap数据结构的内存区域存储缓存数据。 
一级缓存默认是开启的。 
sqlSession执行commit后会清空一级缓存,避免脏读。

二级缓存

二级缓存是mapper级别的,不同sqlSession可以共享同一个mapper中sql的缓存数据。 
二级缓存默认不是开启的,需要通过setting配置开始

    <setting name="cacheEnabled" value="true"/>

禁用二级缓存

通过上面的配置可以全局禁用二级缓存 
在statement中设置 useCache=false 可以禁止当前sql语句的二级缓存,该配置默认是true。

二级缓存的局限性

二级缓存对细粒度的数据级别的缓存实现不好,因为是mapper级别的,同一个namespace下的数据缓存都会被刷新。

flushCache和useCache的使用

当为select语句时: 
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。 
useCache默认为true,表示会将本条语句的结果进行二级缓存。 
当为insert、update、delete语句时: 
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。 
useCache属性在该情况下没有。

一级缓存问题处理

怎么禁用一级缓存的效果

sql级别

flushCache="true"

全局FlushCache

<setting name="localCacheScope" value="STATEMENT"/>

mybaitis插件 

具体参考:https://segmentfault.com/a/1190000009062804










以上是关于mybatis缓存的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis关于复杂的SQL查询的处理&Mybatis的缓存机制

Mybatis 学习笔记总结

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级