一、一级缓存(本地缓存默认开启):sqlSession级别的缓存。一级缓存是一直开启的,无法关闭。SqlSession级别的一个Map
与数据库同义词会话期间查询到的数据会放到本地缓存中。
以后如果需要获取相同的数据,直接从缓存中拿,没有必要再去查询数据库。
1.一级缓存失效情况:
没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询。
1)SqlSession不同
SqlSession openSession = SqlSessionFactory.openSession();
SqlSession openSession2 = SqlSessionFactory.openSession();
2)sqlSession相同,查询条件不一样。原因是当前缓存中没有改变查询条件后的数据
3)sqlSession相同,查询条件一样,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响)
4)sqlSession相同,手动清除了一级缓存(缓存清空)
openSession.clearCache();//清空一级缓存方法
二、二级缓存(全局缓存):基于namespace级别的缓存:一个namespace对应一个二级缓存
工作机制:
1.一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中。
2.如果会话关闭:一级缓存中的数据会被保存到二级缓存中:新的会话查询信息,就可以参照二级缓存中。
3.sqlSession====EmployeeMapper===>Employee
DepartmentMapper====>Department
不同namespace查出的数据会放在自己对应的缓存中(map)
使用方法:
1)开启全局二级缓存配置:
2)去每个mapper.xml中配置使用二级缓存:
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
select EMPLOYEES_SEQ.nextval from dual
insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)
values(#{id},#{lastName},#{email})
update tbl_employee
set last_name=#{lastName},email=#{email},gender=#{gender}
where id=#{id}
delete from tbl_employee where id=#{id}