Mybatis缓存**
-
mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率
-
mybatis系统当中默认定义了两级缓存:一级缓存和二级缓存
-
- 默认情况之下,只有一级缓存开启(sqlSession级别的缓存)
- 二级缓存需要手动开启配置,需要局域namespace级别的缓存。
1.一级缓存
一级缓存也叫本地缓存
-
- 与数据库同一次会话期间查询到的数据会放入的本地缓存当中。
- 如果以后需要获取相同的数据直接去缓存当中拿,没必要再去查询数据库
缓存失效的情况
- sqlSession不同
- sqlSession相同,查询条件不同
- sqlSession相同,两次查询之间执行了增删改操作!
- sqlSession相同,手动清除一级缓存
二级缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactroy创建SqlSession查询结果会被缓存;此后若再次执行相同的查询语句,结果会从一个缓存中获取。
(1).二级缓存开启的条件
①:在核心配置文件中,设置全局属性caheEnable=“true”。
②:在映射件中置
③:查询数据所转换的实体类类型必须实现序列化接口
④:二级缓存必须在SqlSession关闭或提交之后有效
(2).二级缓存失效的情况
两次查询之间行了任意的增删改,会使得一级二级缓存同时失效
(3).开启二级缓存
①.在SqlMapConfig.xml配置文件中开启二级缓存
<!‐‐ 开启二级缓存 ‐‐>
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
②. 在UserDao.xml配置文件声明使用二级缓存
<!--使用二级缓存--> <cache/>
③:查询数据所转换的实体类类型必须实现序列化接口
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// get set方法 .....
}
④:二级缓存必须在SqlSession关闭或提交之后有效
@Test public void findById() throws IOException {
// 1.加载SqlMapConfig配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建sqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3.sqlSessionFactory创建sqlSession
SqlSession sqlSession = factory.openSession();
SqlSession sqlSession2 = factory.openSession();
//4.通过Session创建UserDao接口代理对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user1 = mapper.findById(1);
System.out.println(user1.toString());
// 将其一级缓存的数据放进二级缓存中,并清空一级缓存
sqlSession.close();
System.out.println("-----------------");
UserDao mapper2 = sqlSession2.getMapper(UserDao.class);
User user2 = mapper2.findById(1);
System.out.println(user2.toString());
// 将其一级缓存的数据放进二级缓存中,并清空一级缓存
sqlSession2.close();
System.out.println(user1 == user2);
resourceAsStream.close();
}
(4).重要结论
打印发现2个对象的地址值不一样,但是确实只发送了一次SQL语句的查询,二级缓存中存储的是数据,不是对象。
三、Mybatis缓存查询顺序
- 先查询二级缓存,因为二级缓存中可能会有其他程序查询出来的数据,可以直接拿来使用
- 如果二级缓存命中,再查询一级缓存
- 如果一级缓存也没有命中,则查询数据库
- SqlSession关闭之后,一级缓存的数据会写入二级缓存
本文介绍了Mybatis的缓存特性,包括一级缓存和二级缓存。一级缓存是SqlSession级别的,同一会话内的查询结果会被缓存,但增删改操作会导致缓存失效。二级缓存为SqlSessionFactory级别,需要手动开启并满足特定条件,如实体类实现序列化接口。查询顺序是先查二级缓存,再查一级缓存,最后才查询数据库。
710

被折叠的 条评论
为什么被折叠?



