MyBatis的缓存机制
MyBatis中允许使用缓存,分为一级缓存和二级缓存,下面看下MyBatis中如何配置缓存。
一级缓存和二级缓存ps:下面代码省略主配置文件和sql映射文件,直接给出测试方法。
public class MyBatisTest { // 获取SqlSessionFactory对象 private SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } /** * 两级缓存: * 一级缓存:(本地缓存), 在SqlSession上的缓存, 一级缓存一直开启;sqlSession级别的一个Map * 1. 与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,没有必要在查询数据库 * * 2. 一级缓存失效的情况(没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询) * 1. sqlSession不同 * 2. sqlSession相同,查询条件不同(当前缓存中还没有这个数据) * 3. sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响) * 4. sqlSession相同,手动清除了一级缓存(缓存清空) * * 二级缓存:(全局缓存), 在SqlSessionFactory上的缓存,基于namespace级别的缓存,一个namespace对应一个二级缓存 * 1. 工作机制: * 1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中; * 2、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存中的内容; * 3、不同namespace查出的数据会放在自己对应的map(缓存)中 * * 2. 使用: * 1、开启全局二级缓存设置: * 2、去mapper.xml中进行配置 * 3、我们的POJO需要实现序列化接口 * * 3. 效果: * 数据会从二级缓存中获取;只有会话提交或关闭后,一级缓存中的数据才会转移到二级缓存中 * * @throws IOException */ //测试二级缓存 @Test public void testSecondLevelCache() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); SqlSession openSession2 = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class); Employee emp01 = mapper.getEmployeeById(3); System.out.println(emp01); openSession.close(); //第二次查询是从二级缓存中拿到的数据,并没有发送新的sql Employee emp02 = mapper2.getEmployeeById(3); System.out.println(emp02); System.out.println(emp01 == emp02); } finally { openSession2.close(); } } //测试一级缓存 @Test public void testFirstLevelCache() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee emp01 = mapper.getEmployeeById(3); System.out.println(emp01); Employee emp02 = mapper.getEmployeeById(3); System.out.println(emp02); System.out.println(emp01 == emp02); } finally { openSession.close(); } }}
敲重点:二级缓存的配置
1、 在主配置文件中开启二级缓存总开关
2、sql映射文件中开启二级缓存
3、POJO实现序列化接口
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。