目录
- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(无论是修改谁的)
- 4、同一个SqlSession两次查询期间手动清空了缓存
4:参照缓存:若想在命名空间中共享相同的缓存配置和实例。可以使用 cache-ref 元素来引用另外一个缓存。
MyBatis缓存机制介绍
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率;
数据库交互缓存的机制:
Employee employee = employDao.getEmpById(1);查出来的数据放进一级缓存中;也就是一个map;
MyBatis缓存机制:实质上就是一个Map;能保存查询出的一些数据;
一级缓存:线程级别的缓存;本地缓存;SqlSession级别的缓存;每一次跟数据库的链接都是一个sqlSession;
二级缓存:全局范围的缓存;除过当前线程;SqlSession能用外其他也可以使用;二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
1:一级缓存
1.1:观察一级缓存
一级缓存:MyBatis:SqlSesion级别的缓存;默认存在;当 Session flush 或 close 后, 该 Session 中的所有 Cache 将被清空。
机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取直接从缓存中拿;
本地缓存不能被关闭, 但可以调用 clearCache() 来清空本地缓存, 或者改变缓存的作用域.
1.2:一级缓存失效方法;
- 1、不同的SqlSession对应不同的一级缓存
- 2、同一个SqlSession但是查询条件不同
- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(无论是修改谁的)
- 4、同一个SqlSession两次查询期间手动清空了缓存
1.3:一级缓存的源码原理
一级缓存利用org.apache.ibatis.cache.impl.PerpetualCache,存储在Map<Object, Object> cache = new HashMap();中
这是key:
这是value的初始值:
这是查询出来结果集后放进缓存中的value:
2:二级缓存:
1:二级缓存介绍,
2:二级缓存简单使用步骤
结果:
3:二级缓存的配置属性
4:一,二级缓存的查询顺序(先二级再一级,再查库)
1:不会出现一级缓存和二级缓存中有同一个数据
二级缓存什么时候有数据:一级缓存关闭二级缓存才有;
一级缓存什么时候有数据:二级缓存中没有此数据,就会看一级缓存,一级缓存没有就会去查库,查库结果放在一级 缓存中
3:缓存有关配置
5、当在某一个作用域 (一级缓存Session/二级缓存Namespaces) 进行了 C/U/D 操作后,默认该作用域下所有 select 中的 缓存将被clear
4:mybatis整合第三方缓存
1:导包
<!--整合第三方缓存,以ehcache为例--> <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache --> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency><!--ehcache依赖--> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.0</version> </dependency>
其中包含
ehcache-core-2.6.8.jar
mybatis-ehcache-1.0.3.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.2.jar
2:写配置,编写ehcache.xml配置文件
直接放在根目录下就行
3:配置cache标签
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
4:参照缓存:若想在命名空间中共享相同的缓存配置和实例。可以使用 cache-ref 元素来引用另外一个缓存。