Mybatis -> 11.缓存
文章目录
11.1 什么是缓存
一般比如查询数据,需要连接数据库等操作,消耗资源;一次查询的结果,暂存在可以直接拿到的地方,即内存,再次查询相同数据的时候,直接走缓存。
- 存在内存中的临时数据,将经常查询的数据放在缓存(内存)中,再去查询数据就不用从磁盘上查询了,从缓存中查询,从而提高查询效率,解决高并发系统性能问题;
- 使用缓存可以减少和数据库的交互次数,减少系统开销,提升系统效率;
- 经常查询并且不经常改变的数据,就可以使用缓存。
11.2 一级缓存
-
Mybatis中有两级缓存:一级缓存和二级缓存
-
一级缓存是默认开启的,其只在一次SqlSession层面中有效,也称本地缓存;
-
与数据库同一次会话期间查询到的数据会放在本地缓存中,如果以后需要获取相同数据,直接从缓存中拿;
11.2.1 测试一级缓存
-
开启日志;
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
-
在一个Session中查询两次记录
@Test public void testQueryUserById() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryUserById(1); System.out.println(user); System.out.println("================================="); User user2 = mapper.queryUserById(1); System.out.println(user2); System.out.println(user == user2); sqlSession.close(); }
-
查看日志输出
11.2.2 一级缓存失效的情况
-
查询不同的数据;
-
增删改操作,可能会改变原来的数据,所以会刷新内存;
-
查询不同的Mapper.xml – 已经不是SqlSession层面了
-
手动清理缓存
sqlSession.clearCache();
11.3 二级缓存
-
二级缓存也称全局缓存;
-
二级缓存是基于namespace层面的缓存,一个命名空间,对应一个二级缓存;
-
工作机制:
- 一个SqlSession会话查询一条数据,这个数据会被放在当前会话的一级缓存中;
- 当该会话关闭了,对应的一级缓存中的数据,会被保存到二级缓存中;
- 当新的会话查询数据时,就可以从相应的二级缓存中获取数据;
- 不同的Mapper查询的数据会放在相对应的缓存中,map;
-
要启用全局的二级缓存
-
显式开启全局缓存
<!--显式开启二级缓存--> <setting name="cacheEnabled" value="true"/>
-
要在SQL映射文件中添加一行:
<cache/>
-
性可以通过 cache 元素的属性来扩展。比如:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
-
可用的清除策略有:
LRU
– 最近最少使用:移除最长时间不被使用的对象;FIFO
– 先进先出:按对象进入缓存的顺序来移除它们;SOFT
– 软引用:基于垃圾回收器状态和软引用规则移除对象;WEAK
– 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。默认的清除策略是 LRU。
-
-
测试二级缓存:
-
只有当前会话提交、或者关闭时,才会提交到二级缓存中
11.4 缓存原理
11.5 自定义缓存 ehcache
-
导包
<dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency>
-
在resource中添加
ehcache.xml
-
在Mapper.xml中添加
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
可以通过 useCache属性设置是否使用二级缓存
<select id="queryUserById" parameterType="_int" resultType="user" useCache="false"> select * from mybatis.user where id = #{id} </select>