一级缓存给我们提供了很高速的访问效率,但是它的作用范围实在是有限,如果一个会话结束,那么之前的缓存就全部失效了,但是我们希望缓存能够扩展到所有会话都能使用,因此我们可以通过二级缓存来实现,二级缓存默认是关闭状态,要开启二级缓存,我们需要在映射器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)])