mybatis缓存机制
mybatis中存在一级缓存和二级缓存,默认情况下一级缓存是开启的,而且不能关闭。
一级缓存——sqlSession级别
第一次发送一个SQL查询语句,查询结果将写入到sqlSession的一级缓存中,缓存使用的数据结构是map(HashMap)。
如果第二次同一个sqlSession发出相同的sql请求时,就会从缓存中查询并取出查询结果。但是如果在两次查询期间出现commit操作对数据进行了修改,那么此时的缓存将会自动全部清空,下次再次查询时会去数据库中进行查询,并将其再次写入到缓存中去。
注意:
一级缓存最多缓存1024条SQL;
mybatis默认一级缓存开启,不需要进行配置。
二级缓存——mapper级别
二级缓存的范围是mapper级别的(即同一个mapper命名空间),mapper以命名空间为单位创建缓存,使用的数据结构同样是map。
mybatis的二级缓存是通过CacheExecutor实现的。CacheExecutor是Executor的代理对象。所有的查询操作,在CacheExecutor中都会先匹配缓存中是否存在,如果不存在再去数据库查询。
注意:
- 二级缓存是跨SqlSession的缓存,对于mapper级别的缓存不同的SqlSession是可以进行共享的。
- 二级缓存的使用需要如下的配置:
(1)Mybatis全局配置中启用二级缓存配置。
(2)在对应的Mapper.xml中配置cache节点
(3)在对应的select查询节点中添加useCache=true
全局配置
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
mapper.xml配置
<!-- 开启当前mapper的namespace下的二级缓存 -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>