mybatis一级缓存和二级缓存,mybatis一级缓存和二级缓存的关系

首页 > 经验 > 作者:YD1662022-10-29 11:57:14

mybatis一级缓存和二级缓存,mybatis一级缓存和二级缓存的关系(1)

mybatis缓存机制

mybatis包含缓存机制,恶意方便的配置和定制。

默认定义了一级缓存和二级缓存。

一级缓存

与数据库同义词会话期间查询到的数据会放在本地缓存中,以后获取相同的数据,只需要从缓存中取,没必要查数据库

一级缓存失效的情况二级缓存

一个namespace对应一个二级缓存,不同namespace查出的数据会放在不同的map中

开启二级缓存后,会使用CacheExecutor来装饰Executor,在查询数据时,先查询二级缓存,二级缓存没有再去查一级缓存

二级缓存的使用

开启全局二级缓存配置

<settings> <!-- 开启二级缓存,默认为true --> <setting name="cacheEnabled" value="true"/> </settings>

在映射文件中配置使用二级缓存

<!-- eviction: 缓存回收策略 - LRU 最近最少使用:移除最长时间不被使用的,默认 - FIFO 先进先出,按照对象进入缓存的顺序移除 - SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象 - WEAK 弱引用,积极地移除基于垃圾收集器状态和弱引用规则的对象 flushInterval: 缓存刷新间隔 缓存多长时间清空一次,默认不清空,单位毫秒 readOnly 默认false - true 只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。mybatis为了加快获取速度, 直接将数据在缓存中的引用交给用户,速度快,但是不安全 - false 非只读,mybatis会认为获取到的数据可能会被修改,会利用序列化和反序列化机制克隆一份新的数据 size: 缓存多少元素 type: 指定自定义缓存的全类名,需要实现Cache接口 blocking: 若缓存中找不到对应的key,是否会一直阻塞,知道对应的数据进入缓存 --> <cache eviction="FIFO" flushInterval="60000" readOnly="true" size="1024"/>

由于可能会用到序列化和反序列化,所以使用缓存的对象要实现序列化接口(readOnly为false的时候需要用到序列化和反序列化)

否则会报java.io.NotSerializableException异常

注意:一定要在同一个sqlSessionFactory下的不同sqlSession下使用二级缓存,如果为不同的sqlSessionFactory,永远不可能命中二级缓存的(我测试的时候就犯糊涂了,找了半天配置的问题才反应过来)

@Test public void testTwoLevelCache(){ SqlSession session = sqlSessionFactory.openSession(); // mybatis为接口创建代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.selectUser(8); System.out.println(user); userMapper.updateUser(user); session.close(); SqlSession session1 = sqlSessionFactory.openSession(); UserMapper userMapper1 = session1.getMapper(UserMapper.class); User user1 = userMapper1.selectUser(8); System.out.println(user1); System.out.println(user == user1); session1.close(); } 二级缓存失效的情况

缓存相关配置总结

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.