一级缓存给我们提供了很高速的访问效率,但是它的作用范围实在是有限,如果一个会话结束,那么之前的缓存就全部失效了,但是我们希望缓存能够扩展到所有会话都能使用,因此我们可以通过二级缓存来实现,二级缓存默认是关闭状态,要开启二级缓存,我们需要在映射器XML文件中添加:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
此时即使一个SqlSession关闭了,新的SqlSession也会继承之前的缓存:
public static void main(String[] args) {
try ( SqlSession sqlSession= MybatisUtil.getSqlSession(false)) {
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
Teacher teacher = testMapper.getTeacherById(1);
Teacher teacher1 = testMapper.getTeacherById(1);
System.out.println(teacher == teacher1);
System.out.println(teacher);
teacher.setName("卢本伟");
System.out.println(teacher1);
}
try ( SqlSession sqlSession= MybatisUtil.getSqlSession(false)) {
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
Teacher teacher = testMapper.getTeacherById(1);
System.out.println(teacher);
}
}
----
true
Teacher(tid=1, name=老师1, teachStudent=[Student(sno=21164291, name=李希, age=20, teacher=null), Student(sno=211164297, name=篱笆, age=20, teacher=null)])
Teacher(tid=1, name=卢本伟, teachStudent=[Student(sno=21164291, name=李希, age=20, teacher=null), Student(sno=211164297, name=篱笆, age=20, teacher=null)])
Teacher(tid=1, name=卢本伟, teachStudent=[Student(sno=21164291, name=李希, age=20, teacher=null), Student(sno=211164297, name=篱笆, age=20, teacher=null)])