(3).缓存失效的情况
(1).查询不同的数据
(2).增删改,可能会改变原来的数据,所以数据必定会刷新
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryById(1); System.out.println(user); System.out.println("============"); int i = mapper.updateByID(new User(1, "小傻", "278872")); User user2 = mapper.queryById(1); System.out.println(user2); sqlSession.close(); }
(3).查询不同的Mapper.xml
(4).手动关闭缓存
sqlSession.clearCache();
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryById(1); System.out.println(user); System.out.println("============"); sqlSession.clearCache(); User user2 = mapper.queryById(1); System.out.println(user2); sqlSession.close(); }
5.二级缓存(全局缓存)
要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
二级缓存:也叫全局缓存,一级缓存的作用域太低了,所以诞生了二级缓存
基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
- LRU – 最近最少使用:移除最长时间不被使用的对象。(默认)
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
- WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
二级缓存的工作机制: - 一个 会话查询一条语句,这个数据就会被放在当前会话的而一级缓存里面
- 如果当前会话关闭,这个会话对应的一级缓存就没了。但是我们想要的是会话关闭了,一级缓存的数据保存到二级缓存中。
- 新的会话查询信息,就可以从而二级缓存中获取内容
- 不同的mapper查出的数据会放在自己对应的缓存中去
(1).如何开启二级缓存?
(1).首先开启全局的缓存模式
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true
<setting name="mapUnderscoreToCamelCase" value="true"/>
(2).在要使用二级缓存的mapper.xml配置文件中去
<cache/>
也可以自定义参数
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
(2).测试二级缓存的实列(反列)
这里没有添加二级缓存的标签,所以使用的是一级缓存。
接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import org.apache.ibatis.annotations.Param; public interface UserMapper { // 通过ID对数据进行修改 int updateByID(User user); }
配置文件
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="Com.Jsxs.Dao.UserMapper"> <!-- 通过id对数据进行查询--> <select id="queryById" parameterType="_int" resultType="Com.Jsxs.pojo.User"> select *from user where id=#{id} </select> <!-- 通过id对数据进行修改--> <update id="updateByID" parameterType="Com.Jsxs.pojo.User"> update user set name=#{name},pwd=#{pwd} where id=#{id} </update> </mapper>
测试
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import Com.Jsxs.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class UserTest { // 通过ID进行数据的查询 @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); SqlSession sqlSession1 = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class); User user = mapper.queryById(1); User user1 = mapper1.queryById(1); System.out.println(user); System.out.println("==========================="); System.out.println(user1); sqlSession.close(); sqlSession1.close(); } }
(3).测试二级缓存的实列(正列)
这里会添加成二级缓存的标签
测试
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); SqlSession sqlSession1 = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class); User user = mapper.queryById(1); sqlSession.close(); System.out.println("已经关闭了会话**********"); User user1 = mapper1.queryById(1); System.out.println(user); System.out.println(user1); sqlSession1.close(); }
(4).常见问题:
(1).如果再添加标签的时候,我们没有对数据进行添加参数,需要对实体类进行实列化的接口。
<cache/>
解决方法: 对实体类进行实列化的操作。
package Com.Jsxs.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @NoArgsConstructor @Data @AllArgsConstructor public class User implements Serializable { private int id; private String name; private String pwd; }
2.如果再添加标签的时候,对实体类已经进行了参数的操作,那么就不用对实体类进行实列化就能运行
(5).小结
(1).只要开启了二级缓存,在同一个Mapper下就有效;
(2).所有的数据都会最先存储再一级缓存中
(3).只有当会话提交,或则关闭的时候,才会提交到二级缓冲中去
(6).缓存原理
(二十)、自定义缓存(Ehcache)
Ehcache是一种广泛使用的开源Java分布式缓存。
1.准备工作
导包
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache --> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.1.0</version> </dependency>
在使用的mapper中导入自定义缓存标签
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>