MyBatis一级缓存
MyBatis中的一级缓存是默认开启的,它是sqlSession级别的缓存,一个sqlSession会话的查询操作保存在缓存中,之后的相同查询直接从缓存中获取。当执行insert、update、delete语句时,会清空一级缓存。
一级缓存没有过期时间,不会自动清空,只有在执行更新操作后或者关闭sqlSession会话时才会清空。
@Test
public void test01() throws Exception{
init();
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// 第一次查询
List<Employee> emps1 = mapper.selectEmployeeList();
// 第二次查询
List<Employee> emps2 = mapper.selectEmployeeList();
System.out.println(emps1 == emps2);
session.close();
// 关闭会话后重新查询
session = factory.openSession();
mapper = session.getMapper(EmployeeMapper.class);
List<Employee> emps3 = mapper.selectEmployeeList();
System.out.println(emps1 == emps3);
session.close();
}
@Test
public void test02() throws Exception{
init();
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// 第一次查询
List<Employee> emps1 = mapper.selectEmployeeList();
// 执行更新操作
Employee employee = new Employee();
employee.setId(10);
employee.setName("张三");
mapper.updateEmployee(employee);
// 第二次查询
List<Employee> emps2 = mapper.selectEmployeeList();
System.out.println(emps1 == emps2);
session.close();
}
MyBatis二级缓存
二级缓存需要手动开启,它属于sqlSessionFactory级别的缓存,也就是所有的sqlSession可以共享。一个会话执行查询操作后会先放入一级缓存,等到该会话关闭时才会将一级缓存的数据刷新到二级缓存中。每次查询时会先从二级缓存中获取数据,找不到再去一级缓存中找。
二级缓存的过期时间默认是1个小时,到期后会自动清空。
@Test
public void test03() throws Exception{
init();
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// 第一次查询
List<Employee> emps1 = mapper.selectEmployeeList();
session.close();
// 关闭会话后重新查询
session = factory.openSession();
mapper = session.getMapper(EmployeeMapper.class);
// 第二次查询
List<Employee> emps2 = mapper.selectEmployeeList();
session.close();
}
只执行了一次查询,第二个会话命中二级缓存。
@Test
public void test04() throws Exception{
init();
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// 第一次查询
List<Employee> emps1 = mapper.selectEmployeeList();
session.close();
// 关闭会话后更新
session = factory.openSession();
mapper = session.getMapper(EmployeeMapper.class);
// 执行更新操作
Employee employee = new Employee();
employee.setId(10);
employee.setName("张三");
mapper.updateEmployee(employee);
session.commit();
session.close();
// 再次查询
session = factory.openSession();
mapper = session.getMapper(EmployeeMapper.class);
// 第二次查询
List<Employee> emps2 = mapper.selectEmployeeList();
session.close();
}
中途更新操作刷新二级缓存。